使用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
相关产品推荐
相关产品推荐

