代码共享法宝之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 咒语,让你的智慧结晶闪耀在学院的中央图书馆吧!遇到魔法反噬(构建错误),记得检查羊皮纸(脚本)上的符文(语法)、图书馆地址和门禁卡哦!

相关推荐
爬虫程序猿1 小时前
利用爬虫按关键字搜索淘宝商品实战指南
android·爬虫
顾北川_野2 小时前
Android ttyS2无法打开该如何配置 + ttyS0和ttyS1可以
android·fpga开发
wzj_what_why_how5 小时前
Android网络层架构:统一错误处理的问题分析到解决方案与设计实现
android·架构
千里马学框架5 小时前
User手机上如何抓取界面的布局uiautomatorviewer
android·智能手机·aosp·uiautomator·布局抓取·user版本
阿巴~阿巴~6 小时前
操作系统核心技术剖析:从Android驱动模型到鸿蒙微内核的国产化实践
android·华为·harmonyos
hsx6666 小时前
使用 MaterialShapeDrawable 自定义各种形状的 View
android
用户2018792831677 小时前
滑动城堡的奇妙管家 ——ViewPager故事
android
用户2018792831677 小时前
📜 童话:魔法卷轴与 ScrollView 的奥秘
android
??? Meggie9 小时前
【SQL】使用UPDATE修改表字段的时候,遇到1054 或者1064的问题怎么办?
android·数据库·sql