1. 为什么要把项目发布到Maven Central?
作为Java开发者,我们经常需要在项目中引入各种第三方依赖库。Maven Central作为全球最大的Java构件仓库,已经成为开源项目分发的标准平台。将项目发布到这里意味着:
- 全球开发者都能通过简单的
<dependency>引用你的库 - 无需额外配置仓库地址,默认就会从Central拉取
- 提升项目可信度和专业形象
- 方便依赖管理工具的版本控制
我经历过多次发布流程,发现虽然官方文档齐全,但实际操作中仍会遇到各种"坑"。下面就把完整流程和避坑指南分享给大家。
2. 发布前的准备工作
2.1 注册Sonatype账号
发布到Maven Central需要通过Sonatype的审核。首先访问 issues.sonatype.org 注册账号。注意:
用户名建议使用公司邮箱,个人项目可以用个人邮箱但需要额外验证
注册后需要创建Issue申请仓库权限。模板如下:
项目:com.github.yourname 描述:申请开通Maven Central发布权限 类型:新项目发布通常1-2个工作日内会得到回复。通过后会收到通知邮件。
2.2 配置GPG签名
所有发布到Central的构件必须经过数字签名。安装GPG工具:
# Mac brew install gnupg # Linux sudo apt-get install gnupg # Windows 下载Gpg4win生成密钥对:
gpg --full-generate-key # 选择RSA 4096 # 设置过期时间(建议2年) # 输入姓名和邮箱导出公钥并上传到密钥服务器:
gpg --keyserver hkp://keyserver.ubuntu.com --send-keys [你的密钥ID]3. 项目配置详解
3.1 pom.xml关键配置
<project> <modelVersion>4.0.0</modelVersion> <!-- 必须使用自己的域名倒置 --> <groupId>com.github.yourname</groupId> <artifactId>your-project</artifactId> <version>1.0.0</version> <packaging>jar</packaging> <name>Your Project Name</name> <description>Project description</description> <url>https://github.com/yourname/your-project</url> <licenses> <license> <name>Apache License, Version 2.0</name> <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url> </license> </licenses> <developers> <developer> <name>Your Name</name> <email>your@email.com</email> </developer> </developers> <scm> <connection>scm:git:git://github.com/yourname/your-project.git</connection> <developerConnection>scm:git:ssh://github.com/yourname/your-project.git</developerConnection> <url>https://github.com/yourname/your-project</url> </scm> </project>3.2 部署插件配置
添加Maven部署插件:
<build> <plugins> <plugin> <groupId>org.sonatype.plugins</groupId> <artifactId>nexus-staging-maven-plugin</artifactId> <version>1.6.8</version> <extensions>true</extensions> <configuration> <serverId>ossrh</serverId> <nexusUrl>https://s01.oss.sonatype.org/</nexusUrl> <autoReleaseAfterClose>true</autoReleaseAfterClose> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>3.2.1</version> <executions> <execution> <id>attach-sources</id> <goals> <goal>jar-no-fork</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> <version>3.3.1</version> <executions> <execution> <id>attach-javadocs</id> <goals> <goal>jar</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-gpg-plugin</artifactId> <version>1.6</version> <executions> <execution> <id>sign-artifacts</id> <phase>verify</phase> <goals> <goal>sign</goal> </goals> </execution> </executions> </plugin> </plugins> </build>4. 发布流程实操
4.1 配置settings.xml
在~/.m2/settings.xml中添加:
<settings> <servers> <server> <id>ossrh</id> <username>你的Sonatype用户名</username> <password>你的Sonatype密码</password> </server> </servers> </settings>4.2 执行发布命令
mvn clean deploy这个过程会:
- 编译项目
- 运行测试
- 生成源码包和javadoc
- 用GPG签名所有构件
- 上传到Sonatype临时仓库
4.3 审核与发布
登录 oss.sonatype.org :
- 在Staging Repositories中找到你的构件
- 点击Close按钮(这会触发验证)
- 验证通过后点击Release
首次发布需要等待同步(约2小时),后续发布通常更快。
5. 常见问题与解决方案
5.1 401未授权错误
症状:
[ERROR] Failed to execute goal org.sonatype.plugins:nexus-staging-maven-plugin:1.6.8:deploy (默认-cli) on project xxx: Failed to deploy artifacts: Could not transfer artifact xxx from/to ossrh (https://oss.sonatype.org/content/repositories/snapshots/): Failed to transfer file: https://oss.sonatype.org/content/repositories/snapshots/xxx. Return code is: 401, ReasonPhrase: Unauthorized.解决方法:
- 检查settings.xml中的server配置
- 确保用户名密码正确
- 确认有发布权限
5.2 GPG签名失败
症状:
gpg: signing failed: Inappropriate ioctl for device解决方法: 在~/.gnupg/gpg.conf添加:
use-agent pinentry-mode loopback然后执行:
export GPG_TTY=$(tty)5.3 重复发布相同版本
Maven Central不允许修改已发布的版本。如果发布失败需要重新发布,必须升级版本号。
最佳实践是使用SNAPSHOT版本进行测试,确认无误后再发布正式版。
6. 高级技巧与最佳实践
6.1 自动化发布
可以在CI/CD流程中集成发布过程。GitHub Actions示例:
name: Publish to Maven Central on: release: types: [created] jobs: publish: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Set up JDK uses: actions/setup-java@v2 with: java-version: '11' distribution: 'adopt' - name: Publish to Central env: MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }} MAVEN_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }} GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} run: | mkdir -p ~/.m2 echo "$GPG_PRIVATE_KEY" | gpg --import mvn -B deploy -DskipTests6.2 多模块项目发布
对于多模块项目,需要在父pom中配置:
<distributionManagement> <snapshotRepository> <id>ossrh</id> <url>https://oss.sonatype.org/content/repositories/snapshots</url> </snapshotRepository> <repository> <id>ossrh</id> <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url> </repository> </distributionManagement>然后在每个子模块中配置各自的artifactId。
6.3 版本管理策略
推荐使用语义化版本控制(SemVer):
- MAJOR版本:不兼容的API修改
- MINOR版本:向下兼容的功能新增
- PATCH版本:向下兼容的问题修正
预发布版本可以加后缀,如1.0.0-RC1。
7. 发布后的维护
7.1 更新项目文档
在README中添加使用说明:
## 安装 在pom.xml中添加: ```xml <dependency> <groupId>com.github.yourname</groupId> <artifactId>your-project</artifactId> <version>1.0.0</version> </dependency>7.2 处理issue和PR
及时响应社区反馈,定期发布更新版本。
7.3 版本升级流程
- 更新pom.xml中的版本号
- 更新CHANGELOG.md
- 创建GitHub Release
- 执行mvn deploy
我个人的经验是,首次发布可能会遇到各种问题,但只要按照流程一步步来,通常都能解决。最重要的是保持pom.xml配置的完整性和准确性。发布成功后,你会收到Sonatype的同步通知邮件,之后就可以在全球的Maven项目中引用你的库了。