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
创建仓库(首次使用)
- 登录nexus管理界面(admin + 上面获取的密码)
- 点击设置⚙️ → Repositories → Create repository
- 选择 "maven2 (hosted)"
- 名称填写:
maven-releases
- 保存即可
📋 目录
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仓库,并在其他项目中使用。记住要遵循最佳实践,保持代码质量和版本管理的规范性。