如何使用Gradle通过非废弃方法构建含本地依赖的fat JAR
Gradle 7.x+ 构建含本地JAR依赖的Fat JAR最优实现
以下实现完全替换了已废弃的compile相关API,适配最新Gradle规范,生成的产物可直接在服务器运行。
方案1:使用Gradle内置Jar任务(无需额外插件)
适合依赖结构简单的项目,无需引入第三方插件即可完成打包:
- 先在项目根目录创建
libs文件夹,把所有本地JAR依赖放到该目录下 - 对应配置示例如下:
Groovy DSL(build.gradle)
plugins { id 'java' } group 'com.yourcompany' version '1.0.0' repositories { mavenCentral() } dependencies { // 远程依赖用implementation替换已废弃的compile implementation 'org.apache.commons:commons-lang3:3.14.0' // 导入单个本地JAR implementation files('libs/your-custom-dependency.jar') // 批量导入libs目录下所有JAR implementation fileTree(dir: 'libs', include: ['*.jar']) } jar { // 打包所有运行时依赖 from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } } // 指定可执行JAR的主类,替换为你自己的主类全限定名 manifest { attributes 'Main-Class': 'com.yourcompany.YourEntryClass' } // 避免重复文件打包冲突 duplicatesStrategy = DuplicatesStrategy.EXCLUDE }
Kotlin DSL(build.gradle.kts)
plugins { java } group = "com.yourcompany" version = "1.0.0" repositories { mavenCentral() } dependencies { // 远程依赖 implementation("org.apache.commons:commons-lang3:3.14.0") // 导入单个本地JAR implementation(files("libs/your-custom-dependency.jar")) // 批量导入libs目录下所有JAR implementation(fileTree("libs") { include("*.jar") }) } tasks.jar { from({ configurations.runtimeClasspath.get().map { if (it.isDirectory) it else zipTree(it) } }) manifest { attributes["Main-Class"] = "com.yourcompany.YourEntryClass" } duplicatesStrategy = DuplicatesStrategy.EXCLUDE }
执行./gradlew jar(Windows环境执行gradlew.bat jar),生成的Fat JAR在build/libs/目录下,上传到服务器后执行java -jar 包名.jar即可运行。
方案2:使用Shadow插件(适合复杂场景)
如果项目存在依赖冲突、需要做类重定位避免和服务器环境的包冲突,优先用官方维护的Shadow插件:
Groovy DSL配置示例
plugins { id 'java' // 适配Gradle 8.x的最新版本 id 'com.github.johnrengelman.shadow' version '8.1.1' } group 'com.yourcompany' version '1.0.0' repositories { mavenCentral() } dependencies { // 依赖声明和方案1完全一致 implementation 'org.apache.commons:commons-lang3:3.14.0' implementation fileTree(dir: 'libs', include: ['*.jar']) } shadowJar { manifest { attributes 'Main-Class': 'com.yourcompany.YourEntryClass' } // 可选配置:类重定位,解决同包名不同版本的依赖冲突 // relocate 'com.google.common', 'shaded.com.google.common' }
执行./gradlew shadowJar,生成的带-all后缀的JAR就是可直接运行的Fat JAR。
如果你使用Maven构建
Maven的compile scope并未废弃,使用官方的maven-assembly-plugin即可完成打包,配置示例如下:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.6.0</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>com.yourcompany.YourEntryClass</mainClass> </manifest> </configuration> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
本地JAR依赖声明示例:
<dependency> <groupId>com.yourcompany</groupId> <artifactId>custom-jar</artifactId> <version>1.0.0</version> <scope>system</scope> <systemPath>${project.basedir}/libs/your-custom-dependency.jar</systemPath> </dependency>
执行mvn package即可生成带jar-with-dependencies后缀的Fat JAR。
内容的提问来源于stack exchange,提问作者WackyWollie
相关产品推荐
相关产品推荐

