如何将依赖本地项目的Gradle工程发布至MavenLocal
问题描述
我正在开发一个Android库(该问题不局限于Android场景),现有mylib库工程依赖本地库工程myotherlib。将mylib发布至mavenLocal并引用时,出现以下错误:
> Could not find mylib:myotherlib:0.1.0.
传递依赖未被包含,反而被当作mylib的模块。需实现发布mylib时将myotherlib的代码一并包含。
相关配置
mylib的build.gradle.kts
plugins { ... id("maven-publish") } android { namespace = "com.my.company.mylib" defaultConfig { consumerProguardFiles("consumer-rules.pro") } buildTypes { release { isMinifyEnabled = false } } buildFeatures { buildConfig = true } publishing { singleVariant("release") { withSourcesJar() withJavadocJar() } } } publishing { publications.create<MavenPublication>("release") { groupId = "com.my.company" artifactId = "mylib" version = properties["version"] as String afterEvaluate { from(components["release"]) } } } dependencies { api(project(":myotherlib")) }
settings.gradle.kts
rootProject.name = "mylib" pluginManagement { repositories { gradlePluginPortal() google() mavenCentral() } } dependencyResolutionManagement { repositories { google() mavenCentral() } } include( ":library", ":myotherlib" ) project(":myotherlib").projectDir = File(rootProject.projectDir, "../myotherlib/library")
发布命令:./gradlew mylib:publishToMavenLocal
解决方案
要将myotherlib的代码合并到mylib中发布,可通过以下两种方式实现:
方法1:使用Shadow插件(通用Java/Kotlin/Android场景)
Shadow插件能将依赖的代码合并到主Jar/AAR中,适合大多数库场景:
- 添加Shadow插件到
mylib的build.gradle.kts:
plugins { // 保留原有插件 id("maven-publish") id("com.github.johnrengelman.shadow") version "7.1.2" // 可替换为最新稳定版 }
- 配置Shadow插件,指定合并
myotherlib:
shadowJar { dependencies { include(dependency(project(":myotherlib"))) } archiveClassifier.set("") // 让合并后的Jar作为主artifact,不带额外后缀 }
- 修改Maven发布配置,使用Shadow生成的产物:
publishing { publications.create<MavenPublication>("release") { groupId = "com.my.company" artifactId = "mylib" version = properties["version"] as String // 用shadowJar生成的包替代默认组件 artifact(tasks["shadowJar"]) // 保留源码和文档包 artifact(tasks["sourcesJar"]) artifact(tasks["javadocJar"]) } }
- 执行发布:
./gradlew mylib:shadowJar mylib:publishToMavenLocal
方法2:Android库专属配置(无需额外插件)
针对Android库,可通过原生打包配置合并代码:
- 在
mylib的android块中添加打包合并规则:
android { // 原有配置... packaging { resources { merge("/**") // 合并myotherlib的资源文件 } jniLibs { pickFirsts.add("**/*.so") // 避免JNI库重复冲突 } } }
- 修改发布配置,使用打包后的AAR并排除传递依赖声明:
// 排除myotherlib的传递依赖,避免引用方寻找该库 configurations.all { exclude(group = "com.my.company", module = "myotherlib") } publishing { publications.create<MavenPublication>("release") { groupId = "com.my.company" artifactId = "mylib" version = properties["version"] as String afterEvaluate { artifact(tasks["bundleReleaseAar"]) { extension = "aar" } artifact(tasks["sourcesJar"]) artifact(tasks["javadocJar"]) } } }
- 执行原发布命令即可:
./gradlew mylib:publishToMavenLocal
注意事项
- 合并代码前需检查类名/包名冲突,避免编译或运行时错误。
- 发布完成后,引用
mylib的项目无需再单独依赖myotherlib。 - 若
myotherlib存在其他第三方依赖,需根据需求选择合并或保留传递依赖声明。
内容的提问来源于stack exchange,提问作者michpohl
相关产品推荐
相关产品推荐

