You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Gradle通过非废弃方法构建含本地依赖的fat JAR

Gradle 7.x+ 构建含本地JAR依赖的Fat JAR最优实现

以下实现完全替换了已废弃的compile相关API,适配最新Gradle规范,生成的产物可直接在服务器运行。

方案1:使用Gradle内置Jar任务(无需额外插件)

适合依赖结构简单的项目,无需引入第三方插件即可完成打包:

  1. 先在项目根目录创建libs文件夹,把所有本地JAR依赖放到该目录下
  2. 对应配置示例如下:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 00:15:08