Gradle打可运行Jar包(包含依赖第三方库中的类)

发布时间: 5年前 (2020-04-08)浏览: 1861评论: 0

使用Gradle来打Jar包,在引入Gradle的java插件后,直接就能实现

在build.gradle文件中引入java插件

plugins {    id 'java'}

然后配置maifest主类

jar {    manifest {        attributes "Main-Class": "cn.buddie.GradleTest"
    }
}

最后执行jar任务就能打出来jar包了

gradle jar

但这样,打出来的Jar包中,只包含了自己编写的代码编译成的Class文件。其它依赖的Jar包中的类,不在其中。

解决方式有两种。

一种是引用application插件,通过distTar或distZip打包。这样生成的包里不仅包含了自己项目中写的源码编辑成的jar包,还包括gradle中配置依赖的jar包,同时还生成了shell和bat脚本,通过脚本,可以直接运行我们的程序。

另一种,是在打jar包,直接依赖的第三方类库中的类,一起打包到我们的jar中。

具体如下:

jar {
    manifestContentCharset 'utf-8'
    metadataCharset 'utf-8'
    manifest {
        attributes "Main-Class": "cn.buddie.GradleTest"
    }
    from {
        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
    }}

这样打出来的jar包,可以使用java -jar的方式运行

java -jar myapp.jar

如果领导说,你即需要提供单个的jar,又需要提供tar包,怎么办呢?因为修改了task jar,而task distTar是依赖于task jar。这样的后果就是打出来的tar包中,已经包含了所有你依赖的第三方jar包,同时,你自己项目打出的jar包中,又包含了这些第三方jar包中的类。也就是所有第三方的类,都double了!

我这里最终成功的解决方案为:增加参数,让task jar根据参数来决定是否将第三方依赖类打入自己的jar包。

jar {
    manifestContentCharset 'utf-8'
    metadataCharset 'utf-8'
    manifest {
        attributes "Main-Class": "cn.buddie.GradleTest"
    }
    if (project.hasProperty("allInOne")) {
        from {
            configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
        }
    }}

这里增加了一个“allInOne”的参数,如果不指定参数,就不会将第三方依赖类打入jar包。这样在执行task distTar时,不指定参数,打出来的tar中,第三方依赖类就只有一份。

而在需要所有类在一个Jar包中的Jar文件时,可以使用参数打包

gradle jar -PallInOne

这样不管领导要什么包,都可以在不做任何改动的情况下,满足领导的需求


标签:

上一篇: Java 命令行运行参数
下一篇: XMPP 协议工作流程具体解释

相关文章暂无相关
评论列表暂无评论
发表评论
验证码

«   2024年4月   »
1234567
891011121314
15161718192021
22232425262728
2930
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
    文章归档
    网站收藏
    友情链接
    • RainbowSoft Studio Z-Blog
    • 订阅本站的 RSS 2.0 新闻聚合
    ︿
    Top