代码共享法宝之maven-publish

好的,朋友学!咱们今天用一个魔法学院的比喻,来讲讲怎么在 Android 项目中配置一个"传送魔法",把你的宝贝代码(aar/jar)上传到远方的魔法图书馆(私有 Maven 仓库)。故事的主角就是你的 app 模块里的 build.gradle 文件!


📜 ​​第一章:魔法学院的快递需求​

你,霍格沃茨 Android 分院的魔法学徒,辛苦炼制了一个超强的魔法卷轴(aar,代表你的库)或者一本魔法咒语书(jar,纯 Java/Kotlin 库)。你想把它存放到学院的​​中央魔法图书馆(Nexus/私有 Maven 仓库)​​,这样其他学徒(其他项目)也能借阅(依赖)你的杰作。

但是,总不能每次都自己跑腿送过去吧?你需要一个​​自动传送魔法(Gradle Upload Task)​​!


🛠️ ​​第二章:配置传送魔法阵(编写 Upload Task 脚本)​

这个魔法阵不会直接画在 appbuild.gradle 里,那样太乱了。我们把它画在另一张​​魔法羊皮纸(单独的 .gradle 脚本文件)​ ​上,比如叫 upload.gradle,放在项目根目录的 scripts 文件夹里。

scripts/upload.gradle 的内容(核心魔法阵):​

typescript 复制代码
groovy
Copy
// 告诉 Gradle 我们要使用 Maven 发布插件(这是传送魔法的基石)
apply plugin: 'maven-publish'

// 定义我们要传送的是什么东西(是 aar 还是 jar?)
afterEvaluate { project ->
    // 假设我们主要处理 Android 库 (aar)
    publishing {
        publications {
            // 创建一个叫 'release' 的传送门,专门送正式版卷轴
            release(MavenPublication) {
                // 1. **包裹信息 (魔法卷轴的标签)**:告诉图书馆管理员这东西是谁的、叫啥、版本多少
                groupId = 'com.hogwarts.awesome' // 你的组织/域名倒写,比如 com.hogwarts
                artifactId = 'my-magic-lib'      // 你的库名字,比如 invisibility-cloak
                version = '1.0.0'                 // 版本号,每次更新都要变!

                // 2. **包裹内容 (塞什么东西进传送门)**
                // 如果是 Android 库 (通常生成 aar)
                if (project.plugins.findPlugin('com.android.library')) {
                    from components.release // 把 release 构建变体打包送走![1,2](@ref)
                    // 可选:附赠源码和文档(好学徒的习惯!)
                    artifact sourceJar // 需要定义 sourceJar task (见下方)
                    artifact javadocJar // 需要定义 javadocJar task (见下方)
                }
                // 如果是纯 Java/Kotlin 库 (生成 jar)
                else if (project.plugins.findPlugin('java-library')) {
                    from components.java // 把编译好的 jar 送走![1,2](@ref)
                    artifact sourcesJar // 附赠源码
                    artifact javadocJar // 附赠文档
                }
            }
        }

        // 3. **传送目的地 (魔法图书馆地址和门禁)**
        repositories {
            maven {
                url = "http://your-nexus-ip:8081/repository/maven-releases/" // 图书馆地址!替换成你的仓库 URL[1,2](@ref)
                allowInsecureProtocol = true // 如果地址是 http 而不是 https,必须加这句![1,2](@ref)
                credentials { // 图书馆门禁卡(用户名密码)
                    username = "libraryKeeper" // 替换成你的仓库用户名
                    password = "secretPassword" // 替换成你的仓库密码[1,2](@ref)
                }
            }
        }
    }
}

// 定义制作源码 Jar 的魔法小助手
task sourceJar(type: Jar) {
    archiveClassifier = 'sources'
    if (project.plugins.findPlugin('com.android.library')) {
        from android.sourceSets.main.java.srcDirs
    } else {
        from sourceSets.main.allJava
    }
}

// 定义制作 Javadoc Jar 的魔法小助手 (需要先有 Javadoc)
task javadocJar(type: Jar, dependsOn: javadoc) {
    archiveClassifier = 'javadoc'
    from javadoc.destinationDir
}

​关键魔法解析:​

  • maven-publish 插件:​ ​ 这是 Gradle 官方提供的"标准传送魔法",比老式的 uploadArchives 更强大、更现代 。

  • MavenPublication:​ ​ 代表你要发送的一个包裹。给它贴好标签 (groupId, artifactId, version)。

  • from components.release:​ ​ 这是 Android Library 项目的精髓!它告诉魔法阵自动找到你 release 构建变体生成的 aar 文件以及相关的依赖描述信息 (pom.xml) 。不用再手动找文件路径了!

  • allowInsecureProtocol = true:​ ​ 现实中的魔法图书馆都用 HTTPS(安全门)了。如果你的还在用 HTTP(普通门),​​必须加上这句咒语​​,否则传送门会拒绝开启 !

  • credentials:​​ 图书馆的门禁卡。没有正确的用户名密码,传送过去也会被拒之门外。

  • sourceJar / javadocJar:​​ 附加的贴心小礼物。让其他学徒更容易理解你的魔法原理(源码)和咒语说明(文档) 。


🔮 ​​第三章:在 App 工坊激活魔法阵 (app/build.gradle)​

现在,你回到自己的工坊 (app 模块)。你需要把刚才画好的那个外部魔法阵 (upload.gradle) ​​召唤(apply)​ ​ 到你的工作台 (build.gradle) 上。

​在 app/build.gradle 文件的最下面加上一句:​

csharp 复制代码
groovy
Copy
// 从 scripts 文件夹召唤 upload.gradle 魔法阵
apply from: rootProject.file('scripts/upload.gradle')

​这句咒语的作用:​ ​ 它告诉 Gradle:"在执行我这个模块(app)的构建时,先去把 scripts/upload.gradle 文件里的所有魔法指令也加载进来!" 这样,你为上传任务写的所有配置,就完美地"应用"到了 app 模块。


🧙‍♂️ ​​第四章:念动咒语,发动传送!​

魔法阵配置好了,也加载到你的工坊了。怎么启动它?

你有两种方式施展这个传送魔法:

  1. ​Android Studio 的魔法侧边栏 (Gradle 面板):​

    • 打开 Android Studio 右边的 Gradle 面板(像个小象图标)。

    • 展开你的项目 -> :app -> Tasks -> publishing

    • 双击 publish 或者 publishReleasePublicationToMavenRepository

  2. ​终端命令行 (召唤 Gradle 守护精灵):​

    ruby 复制代码
    bash
    Copy
    # 先清理下工坊(可选)
    ./gradlew :app:clean
    # 发动核心传送魔法!
    ./gradlew :app:publishReleasePublicationToMavenRepository

​施法结果:​

如果一切顺利(魔法阵画对了、图书馆地址对、门禁卡有效),你的魔法卷轴(aar/jar)、源码包、文档包以及一份描述它依赖了哪些其他卷轴的清单(pom.xml),就会被精准地传送到你指定的中央魔法图书馆(Maven 仓库)!


📚 ​​第五章:其他学徒如何借阅你的卷轴?​

其他学徒(项目)想用你的库,只需要在他们的魔法书(项目的 settings.gradle 或顶级 build.gradle)里声明:

rust 复制代码
groovy
Copy
dependencyResolutionManagement {
    repositories {
        // ... 原有仓库如 google(), mavenCentral() ...
        // 添加你们学院的中央图书馆地址
        maven {
            url "http://your-nexus-ip:8081/repository/maven-releases/"
            allowInsecureProtocol true // 如果还是 http 的话
            credentials {
                username "libraryKeeper"
                password "secretPassword"
            }
        }
    }
}

然后在他们模块的魔法清单(build.gradle)里写下借阅请求:

rust 复制代码
groovy
Copy
dependencies {
    implementation 'com.hogwarts.awesome:my-magic-lib:1.0.0'
}

💡 ​​魔法学院生存小贴士:​

  • ​版本号是唯一标识!​ ​ 每次更新你的库,​​务必​ ​修改 version(比如 1.0.1, 1.1.0)。同一个版本号传两次,图书馆管理员(Maven)通常会拒绝覆盖,或者导致混乱 。

  • allowInsecureProtocol 是临时符咒!​​ 为了安全,强烈建议给你的魔法图书馆(Nexus)配置 HTTPS,未来就不用这句咒语了 。

  • ​脚本复用是智慧!​ ​ 把 upload.gradle 写好一次,其他模块需要上传时,只需 apply 它并设置不同的 groupId/artifactId/version 即可,避免重复劳动 。

  • ​试试 components.default?​ ​ 如果你的库没有明确的 release 变体,或者想上传 debug 版到快照仓库 (SNAPSHOT),可以尝试用 components.default 或根据情况调整。


🎉 现在,魔法学徒,你的传送魔法阵已经配置完毕!快去 apply 你的 upload.gradle,念动 publish 咒语,让你的智慧结晶闪耀在学院的中央图书馆吧!遇到魔法反噬(构建错误),记得检查羊皮纸(脚本)上的符文(语法)、图书馆地址和门禁卡哦!

相关推荐
andr_gale7 小时前
04_rc文件语法规则
android·framework·aosp
祖国的好青年8 小时前
VS Code 搭建 React Native 开发环境(Windows 实战指南)
android·windows·react native·react.js
黄林晴8 小时前
警惕!AGP 9.2 别只改版本号,R8 规则与构建链路全线收紧
android·gradle
小米渣的逆袭9 小时前
Android ADB 完全使用指南
android·adb
儿歌八万首9 小时前
Jetpack Compose Canvas 进阶:结合 animateFloatAsState 让自定义图形动起来
android·动画·compose
zhangphil10 小时前
Android Page 3 Flow读sql数据库媒体文件,Kotlin
android·kotlin
神探小白牙10 小时前
echarts,3d堆叠图
android·3d·echarts
李白的天不白10 小时前
如何项目发布到github上
android·vue.js
summerkissyou198710 小时前
Android-RTC、NTP 和 System Time(系统时间)
android