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

如何将依赖本地项目的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中,适合大多数库场景:

  1. 添加Shadow插件到mylib的build.gradle.kts:
plugins {
    // 保留原有插件
    id("maven-publish")
    id("com.github.johnrengelman.shadow") version "7.1.2" // 可替换为最新稳定版
}
  1. 配置Shadow插件,指定合并myotherlib:
shadowJar {
    dependencies {
        include(dependency(project(":myotherlib")))
    }
    archiveClassifier.set("") // 让合并后的Jar作为主artifact,不带额外后缀
}
  1. 修改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"])
    }
}
  1. 执行发布:
./gradlew mylib:shadowJar mylib:publishToMavenLocal

方法2:Android库专属配置(无需额外插件)

针对Android库,可通过原生打包配置合并代码:

  1. 在mylib的android块中添加打包合并规则:
android {
    // 原有配置...
    packaging {
        resources {
            merge("/**") // 合并myotherlib的资源文件
        }
        jniLibs {
            pickFirsts.add("**/*.so") // 避免JNI库重复冲突
        }
    }
}
  1. 修改发布配置,使用打包后的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"])
        }
    }
}
  1. 执行原发布命令即可:
./gradlew mylib:publishToMavenLocal

注意事项

  • 合并代码前需检查类名/包名冲突,避免编译或运行时错误。
  • 发布完成后,引用mylib的项目无需再单独依赖myotherlib。
  • 若myotherlib存在其他第三方依赖,需根据需求选择合并或保留传递依赖声明。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 00:17:04