如何导出包含jcenter依赖库的Jar包?附现有makeJar任务代码
如何将JCenter依赖嵌入自定义导出的Jar包?
嘿,你当前用的makeJar任务只是把自己项目编译后的classes.jar重命名导出,并没有包含第三方依赖的内容。要把com.lzy.net:okgo:3.0.4这类JCenter依赖也打包进最终的ble_sdk.jar,可以试试下面的方法:
方法一:改用Gradle Jar任务直接包含依赖
把原来的Copy类型任务换成Jar类型,这样能更灵活地配置要打包的内容,包括第三方依赖的class文件。替换后的任务代码如下:
task makeJar(type: Jar) { // 指定最终导出的Jar包名称 archiveName = 'ble_sdk.jar' // 包含自己项目编译生成的所有class文件 from sourceSets.main.output // 遍历所有运行时依赖,将依赖Jar里的内容打包进来 configurations.runtimeClasspath.each { file -> if (file.name.endsWith('.jar')) { from zipTree(file) } } // 设置Jar包输出目录 destinationDirectory.set(file('build/libs')) } // 确保先完成项目编译,再执行打包任务 makeJar.dependsOn(build)
代码解释
sourceSets.main.output:替代了你原来引用的build/intermediates/bundles/release/classes.jar,会自动包含项目所有编译后的class文件configurations.runtimeClasspath.each:遍历项目所有运行时依赖的Jar包,用zipTree解压每个Jar并把内容合并到最终的ble_sdk.jar里,这样OkGo这类依赖的代码就会被嵌进去了
可选:只打包指定依赖
如果你不想把所有第三方依赖都嵌进去,只想包含OkGo这类特定依赖,可以给遍历逻辑加个过滤:
configurations.runtimeClasspath.each { file -> // 只包含名称带有okgo的依赖Jar if (file.name.contains('okgo')) { from zipTree(file) } }
额外提醒
- 要是担心后续出现依赖冲突(比如你的SDK被其他项目引用时,对方也用了相同版本的OkGo),可以考虑用Gradle的Shadow插件,它能帮你重命名依赖的包名,从根本上避免冲突
- 记得把原来的Copy类型
makeJar任务删掉,避免任务冲突
内容的提问来源于stack exchange,提问作者Dalai_Lama
相关产品推荐
相关产品推荐

