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仓库,并在其他项目中使用。记住要遵循最佳实践,保持代码质量和版本管理的规范性。

相关推荐
雨白4 小时前
Jetpack系列(二):Lifecycle与LiveData结合,打造响应式UI
android·android jetpack
kk爱闹5 小时前
【挑战14天学完python和pytorch】- day01
android·pytorch·python
每次的天空7 小时前
Android-自定义View的实战学习总结
android·学习·kotlin·音视频
恋猫de小郭7 小时前
Flutter Widget Preview 功能已合并到 master,提前在体验毛坯的预览支持
android·flutter·ios
断剑重铸之日8 小时前
Android自定义相机开发(类似OCR扫描相机)
android
岁月玲珑8 小时前
【使用Android Studio调试手机app时候手机老掉线问题】
android·ide·android studio
还鮟13 小时前
CTF Web的数组巧用
android
小蜜蜂嗡嗡14 小时前
Android Studio flutter项目运行、打包时间太长
android·flutter·android studio
aqi0014 小时前
FFmpeg开发笔记(七十一)使用国产的QPlayer2实现双播放器观看视频
android·ffmpeg·音视频·流媒体