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

使用maven-publish插件发布Gradle项目时如何包含somejar.jar的类

解决Gradle项目发布时将somejar.jar类合并到主Jar根目录的问题

我来帮你搞定这个问题——默认情况下Gradle的jar任务只会打包你项目自己的类,不会把依赖的Jar包内容合并进去,更别说放到同一层级了。这里有两种靠谱的解决办法,你可以根据自己的需求选:

方法一:用Shadow插件(推荐,简单高效)

Shadow插件是Gradle生态里专门用来构建"胖包"(包含依赖的Jar)的工具,使用它可以很方便地把指定依赖的内容解包到主Jar的根目录。

步骤1:引入Shadow插件

在你的build.gradle(Groovy语法)里添加插件:

plugins {
    id 'java'
    id 'com.github.johnrengelman.shadow' version '7.1.2' // 可替换为最新稳定版
}

步骤2:配置ShadowJar任务,解包somejar.jar到根目录

新建或修改shadowJar任务配置块,指定要解包的目标Jar,并把它的内容放到Jar根目录:

shadowJar {
    // 方法1:通过Jar文件名定位(适合本地Jar或名字唯一的依赖)
    def targetJar = configurations.runtimeClasspath.find { it.name == 'somejar.jar' }
    if (targetJar) {
        from zipTree(targetJar) {
            into '' // 空字符串表示将类放到Jar的根目录,和你的主包同级
        }
    }

    // 方法2:通过group和name定位(更准确,适合远程仓库依赖)
    // def targetJar = configurations.runtimeClasspath.find { it.group == 'com.your.group' && it.name == 'somejar' }
    // if (targetJar) {
    //     from zipTree(targetJar) {
    //         into ''
    //     }
    // }

    // 若项目有主类,记得配置Manifest
    manifest {
        attributes 'Main-Class': 'com.your.package.YourMainClass'
    }
}

步骤3:配置发布,用Shadow生成的Jar作为发布产物

如果需要把这个胖包发布到仓库,配置publishing块:

publishing {
    publications {
        shadow(MavenPublication) {
            from components.shadow // 关联Shadow插件的产物
        }
    }
    repositories {
        // 配置你的发布仓库,比如本地仓库或远程Maven仓库
        mavenLocal()
        // maven {
        //     url = uri("https://your.remote.repo")
        //     credentials {
        //         username = 'your-username'
        //         password = 'your-password'
        //     }
        // }
    }
}

执行./gradlew shadowJar就能生成包含somejar类的胖包,执行./gradlew publish即可发布到指定仓库。


方法二:自定义Gradle任务(无需插件,灵活可控)

如果你不想引入第三方插件,也可以自己写一个Jar任务来实现:

步骤1:创建自定义FatJar任务

在build.gradle里添加:

task customFatJar(type: Jar) {
    // 自定义Jar命名规则,比如xxx-all.jar
    archiveBaseName.set('your-project-name')
    archiveClassifier.set('all')

    // 先包含项目自己编译的类
    from sourceSets.main.output

    // 解包somejar.jar到根目录
    def targetJar = configurations.runtimeClasspath.find { it.name == 'somejar.jar' }
    if (targetJar) {
        from zipTree(targetJar) {
            into ''
        }
    }

    // 配置主类(如果需要)
    manifest {
        attributes 'Main-Class': 'com.your.package.YourMainClass'
    }
}

// 把自定义任务绑定到assemble任务,执行assemble时自动生成胖包
assemble.dependsOn customFatJar

步骤2:配置发布自定义FatJar

如果要发布这个自定义Jar,配置publishing块:

publishing {
    publications {
        maven(MavenPublication) {
            artifact customFatJar // 指定用自定义任务生成的Jar
        }
    }
    repositories {
        mavenLocal()
        // 同上,配置你的远程仓库
    }
}

执行./gradlew customFatJar生成Jar,./gradlew publish发布即可。


额外注意点

  • 确保somejar.jar已经正确添加到依赖配置:
    本地Jar的情况:
    dependencies {
        implementation files('libs/somejar.jar')
    }
    
    远程仓库依赖的情况:
    dependencies {
        implementation 'com.your.group:somejar:1.0.0'
    }
    
  • 如果解包后出现类冲突(比如somejar和你的项目有同名类),可以在配置里添加exclude规则排除重复类,Shadow插件和自定义任务都支持该操作。

内容的提问来源于stack exchange,提问作者max

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:43:59