Android Library Maven 发布完整流程指南

Android Library Maven 发布完整流程指南

📱 Mac用户专用版本 - 使用Homebrew管理Nexus服务器

🚀 Mac用户快速开始

一键启动nexus服务器

bash 复制代码
# 1. 安装nexus
brew install nexus

# 2. 启动服务
brew services start nexus

# 3. 获取管理员密码
cat /opt/homebrew/var/nexus/admin.password  # Apple Silicon Mac
# 或
cat /usr/local/var/nexus/admin.password     # Intel Mac

# 4. 访问管理界面
open http://localhost:8081

创建仓库(首次使用)

  1. 登录nexus管理界面(admin + 上面获取的密码)
  2. 点击设置⚙️ → Repositories → Create repository
  3. 选择 "maven2 (hosted)"
  4. 名称填写:maven-releases
  5. 保存即可

📋 目录

  1. 环境准备
  2. 项目初始化
  3. Library模块配置
  4. 发布配置
  5. 认证配置
  6. 发布流程
  7. 使用远程库
  8. 版本管理
  9. 常见问题
  10. 最佳实践

1. 环境准备

1.1 必要环境

  • Android Studio 4.0+
  • Gradle 7.0+
  • JDK 11+
  • Maven仓库服务器(如Nexus、Artifactory等)

1.2 Nexus服务器搭建(可选)

方式一:使用Homebrew安装(Mac推荐)
bash 复制代码
# 安装nexus
brew install nexus

# 启动nexus服务
brew services start nexus

# 或者直接运行
nexus start

# 访问管理界面
http://localhost:8081

# 默认账号:admin
# 密码:在nexus数据目录查看
cat /opt/homebrew/var/nexus/admin.password
# 或者
cat /usr/local/var/nexus/admin.password
方式二:使用Docker搭建
bash 复制代码
# 使用Docker搭建本地Nexus
docker run -d -p 8081:8081 --name nexus sonatype/nexus3

# 访问管理界面
http://localhost:8081

# 默认账号:admin
# 密码:在容器中查看
docker exec -it nexus cat /nexus-data/admin.password
Mac上的nexus服务管理
bash 复制代码
# 启动nexus服务
brew services start nexus

# 停止nexus服务
brew services stop nexus

# 重启nexus服务
brew services restart nexus

# 查看nexus服务状态
brew services list | grep nexus

# 查看nexus日志
tail -f /opt/homebrew/var/log/nexus/nexus.log
# 或者
tail -f /usr/local/var/log/nexus/nexus.log

2. 项目初始化

2.1 创建Android项目

bash 复制代码
# 使用Android Studio创建新项目
# 选择 "No Activity" 或 "Empty Activity"

2.2 添加Library模块

bash 复制代码
# 在Android Studio中:
# File -> New -> New Module -> Android Library
# 模块名:your-library-name

2.3 项目结构

bash 复制代码
MyProject/
├── app/                     # 主应用模块
├── your-library-name/       # 库模块
├── build.gradle.kts         # 项目级配置
├── settings.gradle.kts      # 项目设置
├── gradle.properties        # 全局属性
└── README.md

3. Library模块配置

3.1 基础配置 (your-library-name/build.gradle.kts)

kotlin 复制代码
plugins {
    alias(libs.plugins.androidLibrary)
    alias(libs.plugins.jetbrainsKotlinAndroid)
    `maven-publish`  // 添加Maven发布插件
}

android {
    namespace = "com.yourcompany.yourlibrary"
    compileSdk = 35

    defaultConfig {
        minSdk = 21
        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
        consumerProguardFiles("consumer-rules.pro")
    }

    buildTypes {
        release {
            isMinifyEnabled = false
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }
    
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_11
        targetCompatibility = JavaVersion.VERSION_11
    }
    
    kotlinOptions {
        jvmTarget = "11"
    }
}

dependencies {
    // 你的依赖项
    implementation(libs.androidx.core.ktx)
    implementation(libs.androidx.appcompat)
    implementation(libs.material)
    
    // 测试依赖
    testImplementation(libs.junit)
    androidTestImplementation(libs.androidx.junit)
    androidTestImplementation(libs.androidx.espresso.core)
}

3.2 添加库代码

创建你的库功能代码,例如:

kotlin 复制代码
// your-library-name/src/main/java/com/yourcompany/yourlibrary/YourLibraryApi.kt
package com.yourcompany.yourlibrary

import android.content.Context
import android.widget.Toast

object YourLibraryApi {
    
    fun showMessage(context: Context, message: String) {
        Toast.makeText(context, message, Toast.LENGTH_SHORT).show()
    }
    
    fun getLibraryVersion(): String {
        return "1.0.0"
    }
}

4. 发布配置

4.1 完整的发布配置 (your-library-name/build.gradle.kts)

在dependencies块后添加:

kotlin 复制代码
// Maven发布配置
publishing {
    publications {
        register<MavenPublication>("release") {
            // 基本信息
            groupId = "com.yourcompany"           // 组织ID
            artifactId = "your-library-name"      // 库名
            version = "1.0.0"                     // 版本号

            // 生成组件
            afterEvaluate {
                from(components["release"])
            }

            // POM信息
            pom {
                name.set("Your Library Name")
                description.set("A useful Android library")
                url.set("https://github.com/yourcompany/your-library-name")
                
                licenses {
                    license {
                        name.set("The Apache License, Version 2.0")
                        url.set("http://www.apache.org/licenses/LICENSE-2.0.txt")
                    }
                }
                
                developers {
                    developer {
                        id.set("developer-id")
                        name.set("Developer Name")
                        email.set("developer@yourcompany.com")
                    }
                }
                
                scm {
                    connection.set("scm:git:git://github.com/yourcompany/your-library-name.git")
                    developerConnection.set("scm:git:ssh://github.com/yourcompany/your-library-name.git")
                    url.set("https://github.com/yourcompany/your-library-name")
                }
            }
        }
    }
    
    repositories {
        maven {
            name = "nexus"
            // 生产环境使用HTTPS
            url = if (version.toString().endsWith("SNAPSHOT")) {
                uri("http://localhost:8081/repository/maven-snapshots/")
            } else {
                uri("http://localhost:8081/repository/maven-releases/")
            }
            
            // 本地开发允许HTTP
            isAllowInsecureProtocol = true
            
            credentials {
                username = project.findProperty("nexusUsername") as String? ?: ""
                password = project.findProperty("nexusPassword") as String? ?: ""
            }
        }
        
        // 可选:同时发布到多个仓库
        maven {
            name = "githubPackages"
            url = uri("https://maven.pkg.github.com/yourcompany/your-library-name")
            credentials {
                username = project.findProperty("githubUsername") as String? ?: ""
                password = project.findProperty("githubToken") as String? ?: ""
            }
        }
    }
}

4.2 版本管理配置

创建版本管理文件 (your-library-name/version.gradle.kts):

kotlin 复制代码
// 版本配置
object LibraryVersion {
    const val MAJOR = 1
    const val MINOR = 0
    const val PATCH = 0
    const val BUILD = 0
    
    const val VERSION_NAME = "$MAJOR.$MINOR.$PATCH"
    const val VERSION_CODE = MAJOR * 10000 + MINOR * 100 + PATCH
    
    fun isSnapshot(): Boolean {
        return System.getProperty("snapshot", "false").toBoolean()
    }
    
    fun getVersionName(): String {
        return if (isSnapshot()) {
            "$VERSION_NAME-SNAPSHOT"
        } else {
            VERSION_NAME
        }
    }
}

在build.gradle.kts中使用:

kotlin 复制代码
// 应用版本配置
apply(from = "version.gradle.kts")

publishing {
    publications {
        register<MavenPublication>("release") {
            groupId = "com.yourcompany"
            artifactId = "your-library-name"
            version = LibraryVersion.getVersionName()  // 使用版本管理
            
            // ... 其他配置
        }
    }
}

5. 认证配置

5.1 全局认证配置 (gradle.properties)

properties 复制代码
# 项目基本配置
android.useAndroidX=true
android.nonTransitiveRClass=true
kotlin.code.style=official
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8

# Maven仓库认证配置
nexusUsername=your-nexus-username
nexusPassword=your-nexus-password

# 可选:GitHub Packages认证
githubUsername=your-github-username
githubToken=your-github-token

# 可选:Maven Central认证
ossrhUsername=your-ossrh-username
ossrhPassword=your-ossrh-password

5.2 本地认证配置 (~/.gradle/gradle.properties)

properties 复制代码
# 全局认证配置(推荐)
nexusUsername=your-nexus-username
nexusPassword=your-nexus-password
---

## 6. 发布流程

### 6.1 发布前检查
```bash
# 1. 清理项目
./gradlew clean

# 2. 检查代码质量
./gradlew check

# 3. 构建库
./gradlew :your-library-name:build

# 4. 运行测试
./gradlew :your-library-name:test

6.2 发布到特定仓库

bash 复制代码
# 发布到所有配置的仓库
./gradlew :your-library-name:publish

6.3 发布SNAPSHOT版本

bash 复制代码
# 发布SNAPSHOT版本(开发版本)
./gradlew :your-library-name:publish -Psnapshot=true

6.4 发布验证

bash 复制代码
# 检查发布的文件
ls -la your-library-name/build/outputs/aar/

# 验证POM文件
cat your-library-name/build/publications/release/pom-default.xml

7. 使用远程库

7.1 项目配置 (settings.gradle.kts)

kotlin 复制代码
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        
        // 添加私有仓库
        maven {
            name = "nexus"
            url = uri("http://localhost:8081/repository/maven-public/")
            isAllowInsecureProtocol = true
            credentials {
                username = providers.gradleProperty("nexusUsername").getOrElse("")
                password = providers.gradleProperty("nexusPassword").getOrElse("")
            }
        }
    }
}

7.2 添加依赖 (app/build.gradle.kts)

kotlin 复制代码
dependencies {
    // 使用远程库
    implementation("com.yourcompany:your-library-name:1.0.0")
    
    // 或使用动态版本
    implementation("com.yourcompany:your-library-name:1.+")
    
    // 或使用SNAPSHOT版本
    implementation("com.yourcompany:your-library-name:1.0.0-SNAPSHOT")
}

7.3 使用库功能

kotlin 复制代码
// MainActivity.kt
import com.yourcompany.yourlibrary.YourLibraryApi

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        // 使用远程库
        YourLibraryApi.showMessage(this, "远程库调用成功!")
        
        val version = YourLibraryApi.getLibraryVersion()
        Log.d("LibraryVersion", "当前库版本: $version")
    }
}

8. 版本管理

8.1 版本号规范

diff 复制代码
主版本号.次版本号.修订号[-预发布版本]

示例:
- 1.0.0        - 正式版本
- 1.0.0-SNAPSHOT - 开发版本
- 1.0.0-alpha   - 内测版本
- 1.0.0-beta    - 公测版本
- 1.0.0-rc1     - 候选版本

8.2 版本发布策略

kotlin 复制代码
// 版本管理脚本
tasks.register("bumpVersion") {
    doLast {
        val versionFile = file("version.properties")
        val props = Properties()
        props.load(versionFile.inputStream())
        
        val currentVersion = props.getProperty("VERSION_NAME")
        val newVersion = incrementVersion(currentVersion)
        
        props.setProperty("VERSION_NAME", newVersion)
        props.store(versionFile.outputStream(), null)
        
        println("版本更新: $currentVersion -> $newVersion")
    }
}

8.3 自动化版本发布

bash 复制代码
# 创建发布脚本 (release.sh)
#!/bin/bash

# 1. 检查当前分支
if [ "$(git branch --show-current)" != "main" ]; then
    echo "请在main分支上进行发布"
    exit 1
fi

# 2. 检查工作区是否干净
if [ -n "$(git status --porcelain)" ]; then
    echo "工作区不干净,请提交所有更改"
    exit 1
fi

# 3. 更新版本
./gradlew bumpVersion

# 4. 构建和测试
./gradlew clean build test

# 5. 发布到仓库
./gradlew :your-library-name:publish

# 6. 创建Git标签
VERSION=$(grep VERSION_NAME version.properties | cut -d'=' -f2)
git add version.properties
git commit -m "Release version $VERSION"
git tag -a "v$VERSION" -m "Release version $VERSION"
git push origin main --tags

echo "版本 $VERSION 发布成功!"

9. 常见问题

9.1 编译问题

问题Could not resolve com.yourcompany:your-library-name:1.0.0

bash 复制代码
# 解决方案
1. 检查仓库配置是否正确
2. 验证认证信息
3. 确认库已成功发布
4. 清理Gradle缓存
./gradlew clean
rm -rf ~/.gradle/caches/

9.2 认证问题

问题Received status code 401 from server: Unauthorized

bash 复制代码
# 解决方案
1. 检查用户名密码是否正确
2. 确认用户有发布权限
3. 验证仓库URL是否正确
4. 检查token是否过期

9.3 版本冲突

问题Version 1.0.0 already exists

bash 复制代码
# 解决方案
1. 更新版本号
2. 使用SNAPSHOT版本进行开发
3. 删除现有版本(如果允许)
4. 使用版本管理工具

9.4 依赖解析问题

问题Cannot resolve external dependency

bash 复制代码
# 解决方案
1. 检查网络连接
2. 验证仓库可访问性
3. 更新Gradle版本
4. 强制刷新依赖
./gradlew --refresh-dependencies

9.5 Mac特有问题

问题1:brew安装的nexus无法启动
bash 复制代码
# 检查nexus服务状态
brew services list | grep nexus

# 如果服务未启动,尝试重新安装
brew uninstall nexus
brew install nexus
brew services start nexus

# 检查端口是否被占用
lsof -i :8081
问题2:找不到nexus管理员密码
bash 复制代码
# Intel Mac路径
cat /usr/local/var/nexus/admin.password

# Apple Silicon Mac路径
cat /opt/homebrew/var/nexus/admin.password

# 如果文件不存在,查看nexus日志
tail -f /opt/homebrew/var/log/nexus/nexus.log
问题3:nexus数据目录权限问题
bash 复制代码
# 修复nexus数据目录权限
sudo chown -R $(whoami) /opt/homebrew/var/nexus
sudo chown -R $(whoami) /opt/homebrew/var/log/nexus

# 或者对于Intel Mac
sudo chown -R $(whoami) /usr/local/var/nexus
sudo chown -R $(whoami) /usr/local/var/log/nexus
问题4:Java版本不兼容
bash 复制代码
# 检查Java版本
java -version

# 如果Java版本过低,使用brew安装JDK
brew install openjdk@11
brew install openjdk@17

# 设置JAVA_HOME
export JAVA_HOME=/opt/homebrew/opt/openjdk@11/libexec/openjdk.jdk/Contents/Home
# 或者
export JAVA_HOME=/usr/local/opt/openjdk@11/libexec/openjdk.jdk/Contents/Home

10. 最佳实践

10.1 开发流程

markdown 复制代码
1. 功能开发 -> 本地模块依赖
2. 功能测试 -> 发布SNAPSHOT版本
3. 集成测试 -> 发布RC版本
4. 正式发布 -> 发布正式版本

10.2 仓库管理

diff 复制代码
- 开发环境: maven-snapshots
- 测试环境: maven-staging
- 生产环境: maven-releases

10.3 安全建议

markdown 复制代码
1. 使用HTTPS连接生产仓库
2. 定期更新认证信息
3. 使用环境变量存储敏感信息
4. 启用仓库访问日志

10.4 性能优化

kotlin 复制代码
// Gradle配置优化
org.gradle.parallel=true
org.gradle.caching=true
org.gradle.configureondemand=true
org.gradle.jvmargs=-Xmx4096m -XX:+UseG1GC

10.5 Mac开发环境最佳实践

环境变量配置
bash 复制代码
# 在 ~/.zshrc 或 ~/.bash_profile 中添加
# Java环境变量
export JAVA_HOME=/opt/homebrew/opt/openjdk@11/libexec/openjdk.jdk/Contents/Home
export PATH=$JAVA_HOME/bin:$PATH

# Android SDK环境变量
export ANDROID_HOME=$HOME/Library/Android/sdk
export PATH=$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$PATH

# Gradle环境变量
export GRADLE_HOME=/opt/homebrew/opt/gradle/libexec
export PATH=$GRADLE_HOME/bin:$PATH
brew维护命令
bash 复制代码
# 更新homebrew
brew update

# 升级nexus
brew upgrade nexus

# 清理旧版本
brew cleanup

# 查看nexus信息
brew info nexus
本地开发建议
bash 复制代码
# 创建nexus配置别名
alias nexus-start='brew services start nexus'
alias nexus-stop='brew services stop nexus'
alias nexus-status='brew services list | grep nexus'
alias nexus-logs='tail -f /opt/homebrew/var/log/nexus/nexus.log'

# 添加到 ~/.zshrc
echo 'alias nexus-start="brew services start nexus"' >> ~/.zshrc
echo 'alias nexus-stop="brew services stop nexus"' >> ~/.zshrc
echo 'alias nexus-status="brew services list | grep nexus"' >> ~/.zshrc
echo 'alias nexus-logs="tail -f /opt/homebrew/var/log/nexus/nexus.log"' >> ~/.zshrc
macOS权限管理
bash 复制代码
# 检查文件权限
ls -la /opt/homebrew/var/nexus/

# 修复权限问题
sudo chown -R $(whoami):admin /opt/homebrew/var/nexus
sudo chmod -R 755 /opt/homebrew/var/nexus

# 对于Intel Mac
sudo chown -R $(whoami):admin /usr/local/var/nexus
sudo chmod -R 755 /usr/local/var/nexus

🎯 完整发布检查清单

发布前检查

  • 代码已提交并推送到Git仓库
  • 版本号已更新
  • 所有测试通过
  • 文档已更新
  • 依赖项已检查

发布过程

  • 构建成功
  • 发布到仓库成功
  • 在仓库中能找到发布的文件
  • POM文件信息正确

发布后验证

  • 在新项目中能正常依赖
  • 功能正常工作
  • 版本信息正确
  • 文档已更新

📚 参考资源


**恭喜!你已经掌握了完整的Maven发布流程!**🎉

按照这个指南,你可以成功地将Android库发布到Maven仓库,并在其他项目中使用。记住要遵循最佳实践,保持代码质量和版本管理的规范性。

相关推荐
BUG创建者22 分钟前
openlayer根据不同的状态显示不同的图层颜色
android·java·javascript
用户20187928316736 分钟前
浅谈画框ImageView的background和src属性的差异
android
2501_915909061 小时前
iOS 加固工具实战解析,主流平台审核机制与工具应对策略
android·ios·小程序·https·uni-app·iphone·webview
马 孔 多 在下雨1 小时前
安卓服务与多线程
android
2501_915106323 小时前
iOS WebView 调试实战,第三方脚本加载失败与内容安全策略冲突问题排查指南
android·ios·小程序·https·uni-app·iphone·webview
消失的旧时光-19434 小时前
Android 键盘
android·键盘监听
Jackilina_Stone17 小时前
【faiss】用于高效相似性搜索和聚类的C++库 | 源码详解与编译安装
android·linux·c++·编译·faiss
棒棒AIT18 小时前
mac 苹果电脑 Intel 芯片(Mac X86) 安卓虚拟机 Android模拟器 的救命稻草(下载安装指南)
android·游戏·macos·安卓·mac
fishwheel18 小时前
Android:Reverse 实战 part 2 番外 IDA python
android·python·安全