上一节中我们介绍了一种gradle打包jar的方式,那就是将所有的依赖全部打包到一个文件中去,生成一个比较大的可执行文件,这个方法的好处在于依赖关系容易处理,但是坏处也是显而易见的。那就是,jar文件体积比较大,而且如果是多个可执行的java程序要共用同一个jar文件会比较不方便。
因此,实际生产环境中,使用打包多个jar文件,将依赖全部复制到一个文件中的情况会比较多。
对于这个方法,需要有两步来做,一个是给可执行的jar文件添加class-path属性,另一个是将依赖的jar文件全部复制到jar文件的相对路径中去。
这里需要大家对gradle相对熟悉一点。
jar { String classpath = '' configurations.runtime.each {classpath = classpath + " libs/"+it.name} manifest { attributes 'Main-Class': 'Main' attributes 'Class-Path': classpath } }
大家可以看到,这里首先没有了from这个属性,取而代之的是manifest中添加了一个Class-Path属性,并且这个Class-Path属性的值是通过遍历configurations.runtime,拼接所有的依赖后,组成的一个classpath字符串,并且添加到manifest的属性中去。
然后添加一个将依赖复制到特定目录的任务,如下:
task copyLibs(type: Copy) { delete "build/libs/libs" from configurations.runtime into "build/libs/libs" }
最后新建一个任务,用于生成可执行的jar文件,这个任务直接让依赖jar与copyLibs这两个任务,并且将生成的可执行文件搬运到dist目录下去,如下:
task release(type: Copy, dependsOn: [jar, copyLibs]) { delete "dist" from "build/libs" into "dist" }
完整的build.gradle文件如下:
apply plugin:'java' repositories { mavenCentral() } dependencies { compile "io.vertx:vertx-core:+" } jar { String classpath = '' configurations.runtime.each {classpath = classpath + " libs/"+it.name} manifest { attributes 'Main-Class': 'Main' attributes 'Class-Path': classpath } } task copyLibs(type: Copy) { delete "build/libs/libs" from configurations.runtime into "build/libs/libs" } task release(type: Copy, dependsOn: [jar, copyLibs]) { delete "dist" from "build/libs" into "dist" }
最后大家就可以使用命令gradle release去生成可执行的jar文件了。
文章作者:沃航科技