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

阅读更多

使用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

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

你可能感兴趣的:(Gradle打可运行Jar包(包含依赖第三方库中的类))