原依赖存于单独lib正常运行,现需Jar含全依赖,求Gradle执行方法
如何构建包含所有依赖的可执行Jar并运行它
没问题!我来帮你搞定这个事——要把所有外部依赖打包进单个可执行Jar(也就是常说的「fat jar」),咱们可以通过调整Gradle配置来实现,下面分两种常见方法给你说明:
方法一:使用Shadow插件(推荐,开箱即用)
Shadow是Gradle生态里专门用来构建fat jar的插件,能自动处理依赖合并、重复文件冲突这些问题,非常省心。
1. 修改你的Gradle配置文件
在build.gradle里更新插件配置,替换或补充原来的内容:
plugins { id 'java-library' id 'com.github.johnrengelman.shadow' version '7.1.2' // 可根据Gradle版本选择最新兼容版 } group = 'com.MyCompany' version = '0.0.1-SNAPSHOT' description = "data-purge-service" sourceCompatibility = 1.8 targetCompatibility = 1.8 tasks.withType(JavaCompile) { options.encoding = 'UTF-8' // 补充完整编码值 } // 配置Shadow插件,指定你的主类(程序入口) shadowJar { manifest { attributes 'Main-Class': 'com.MyCompany.data.purge.YourMainClass' // 替换成你实际的主类全限定名 } }
2. 构建fat jar
在终端执行以下命令:
- Linux/Mac:
./gradlew shadowJar - Windows:
gradlew.bat shadowJar
构建完成后,fat jar会生成在build/libs/目录下,文件名一般是data-purge-service-0.0.1-SNAPSHOT-all.jar(带-all后缀的就是包含所有依赖的Jar)。
3. 运行这个Jar
直接用java -jar命令执行即可:
java -jar build/libs/data-purge-service-0.0.1-SNAPSHOT-all.jar
方法二:自定义Gradle Task(无需额外插件)
如果你不想引入第三方插件,也可以自己写一个Gradle Task来构建fat jar:
1. 添加自定义Task到build.gradle
在配置文件末尾添加以下内容:
task fatJar(type: Jar) { // 指定主类,替换成你的实际入口类 manifest { attributes 'Main-Class': 'com.MyCompany.data.purge.YourMainClass' } // 把所有依赖的class文件打包进来 from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } } // 合并原Jar的内容 with jar }
2. 构建并运行
- 构建命令:
./gradlew fatJar(Linux/Mac)或gradlew.bat fatJar(Windows) - 运行命令:
java -jar build/libs/data-purge-service-0.0.1-SNAPSHOT.jar
注意:自定义Task可能会遇到依赖重复文件(比如META-INF下的文件)的问题,如果出现报错,你需要在Task里添加排除规则,比如:
from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it).matching { exclude 'META-INF/*.SF' exclude 'META-INF/*.DSA' exclude 'META-INF/*.RSA' } } }
内容的提问来源于stack exchange,提问作者Abdul Haye
相关产品推荐
相关产品推荐

