使用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
这样不管领导要什么包,都可以在不做任何改动的情况下,满足领导的需求