首页 > java > 发布一个项目到Maven的中央仓库

发布一个项目到Maven的中央仓库

如果想要发布一个项目到Maven的中央仓库需要走很多流程,相比其他仓库composer、nmp来说复杂许多。首先你得找个代码托管服务,个人推荐github.com。因为发布到github非常容易,但是无法在项目使用maven的自动依赖功能,这里介绍如何在maven的中央仓库中创建一个项目。

Maven的中央仓库是由Sonatype提供,貌似所有的项目创建都需要审核,对于国内外时差来说会有很大的延迟,不过我试过一天就能通过了审核。

第一步:你得注册一个账户https://issues.sonatype.org/secure/Signup!default.jspa


第二步:你得创建一个Issuehttps://issues.sonatype.org/secure/CreateIssue.jspa?issuetype=21&pid=10134


此时需要你填写一个表单,这里带星号的是必填项。

Summary:你的项目的名称

Description:建议还是写一些比较好

Group Id:com.github.shuiguang(换成你自己的即可,只要符合域名规范即可)

Project URL:在github上复制你的项目的url地址

SCM url:在github上复制你的项目的git地址

最后点击“Create”创建这个Issue,


第三步:然后你可以做其他事情了,因为审核是需要花时间的,请定期登陆网站并检查该Issue是否通过了审核,如果Issue状态变成了RESOLVED,这时说明已经通过了审核。


第四步:使用GPG生成密钥对,参考《使用gpg4win生成密钥对》


第五步:修改 Maven 配置文件,需要修改的 Maven 配置文件包括:setting.xml(全局级别)与 pom.xml(项目级别)。

1. setting.xml

<settings>
  ...
  <server>
	<id>releases</id>
	<username>用户名</username>
	<password>密码</password>
  </server>
  <server>
	<id>snapshots</id>
	<username>用户名</username>
	<password>密码</password>
    </server>
  ...
</settings>

将其中的your-jira-id和your-jira-pwd替换为你在https://issues.sonatype.org/上的用户名和密码。

m2 目录在linux下路径为/home/user-name/.m2,windows下路径为C:\Users\your-user-name\.m2

如果后面步骤中发现settings修改不生效可参考:Maven Sonatype Nexus return 401

2. pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.github.shuiguang</groupId>
  <artifactId>soapapi-java</artifactId>
  <name>java soap client</name>
  <version>1.0.0</version>
  <packaging>jar</packaging>
  
  <url>https://github.com/shuiguang/soapapi-java</url>
  <description>java soap client</description>
  
  <licenses>
      <license>
          <name>The Apache Software License, Version 2.0</name>
          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
      </license>
  </licenses>
  
  <developers>
        <developer>
            <name>shuiguang</name>
            <email>zhengshuiguang@163.com</email>
        </developer>
  </developers>
  
  <scm>
        <connection>scm:git:https://github.com/shuiguang/soapapi-java</connection>
        <developerConnection>scm:git:git@github.com:shuiguang/soapapi-java.git</developerConnection>
        <url>https://github.com/shuiguang/soapapi-java</url>
    <tag>soapapi-java-1.0.0</tag>
  </scm>
  
  <profiles>
      <profile>
          <id>release</id>
          <build>
              <plugins>
                  <!-- Source -->
                  <plugin>
                      <groupId>org.apache.maven.plugins</groupId>
                      <artifactId>maven-source-plugin</artifactId>
                      <version>2.2.1</version>
                      <executions>
                          <execution>
                              <phase>package</phase>
                              <goals>
                                  <goal>jar-no-fork</goal>
                              </goals>
                          </execution>
                      </executions>
                  </plugin>
                  <!-- Javadoc -->
                  <plugin>
                      <groupId>org.apache.maven.plugins</groupId>
                      <artifactId>maven-javadoc-plugin</artifactId>
                      <version>2.9.1</version>
                      <executions>
                          <execution>
                              <phase>package</phase>
                              <goals>
                                  <goal>jar</goal>
                              </goals>
                          </execution>
                      </executions>
                  </plugin>
                  <!-- GPG -->
                  <plugin>
                      <groupId>org.apache.maven.plugins</groupId>
                      <artifactId>maven-gpg-plugin</artifactId>
                      <version>1.5</version>
                      <executions>
                          <execution>
                              <phase>verify</phase>
                              <goals>
                                  <goal>sign</goal>
                              </goals>
                          </execution>
                      </executions>
                  </plugin>
              </plugins>
          </build>
          <distributionManagement>
              <snapshotRepository>
                  <id>snapshots</id>
                  <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
              </snapshotRepository>
              <repository>
                  <id>releases</id>
                  <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
              </repository>
          </distributionManagement>
      </profile>
  </profiles>
  
  <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  </properties>
  
  <dependencies>
    <dependency>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>4.10</version>
		<scope>test</scope>
	</dependency>
	
	<dependency>
	  	<groupId>com.alibaba</groupId>
		<artifactId>fastjson</artifactId>
		<version>1.1.48.android</version>
	</dependency>
  </dependencies>
  
  <build>
  	<plugins>
	      <plugin>
	          <groupId>org.apache.maven.plugins</groupId>  
	          <artifactId>maven-compiler-plugin</artifactId>  
	          <version>2.3.2</version>  
	          <configuration>  
	              <source>1.7</source>  
	              <target>1.7</target>  
	          </configuration>  
	      </plugin>  
	  </plugins>
  </build>
  
</project>

注意:以上 pom.xml 必须包括:name、description、url、licenses、developers、scm 等基本信息,此外,使用了 Maven 的 profile 功能,只有在 release 的时候,创建源码包、创建文档包、使用 GPG 进行数字签名。此外,snapshotRepository 与 repository 中的 id 一定要与 setting.xml 中 server 的 id 保持一致。


第六步:上传构件到 OSS 中

mvn clean deploy -P release

如果你正在使用eclispe的Maven插件,执行clean deploy -P release之前建议重启一下(保证eclipse能读取到gpg.exe的环境变量)。

blob.png


当执行以上 Maven 命令时,会自动弹出上面的对话框,需要输入上面提到的 Passphase,它就是通过 GPG 密钥对的密码,只有自己才知道。随后会看到大量的 upload 信息,而且速度比较慢,经常会 timeout,需要反复尝试。

如果没有弹窗,可以尝试下面的命令

mvn clean deploy -P release -Dgpg.passphrase=你的GPG密钥对密码

OSS仓库地址:https://oss.sonatype.org

注意:此时上传的构件并未正式发布到中央仓库中,只是部署到 OSS 中了,下面才是真正的发布。

如果你最终看到以下状态说明部署到OSS成功了:

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 16:32 min
[INFO] Finished at: 2016-06-24T01:29:59+08:00
[INFO] Final Memory: 13M/41M

第七步:在 OSS 中发布构件

在 OSS 中,使用自己的 Sonatype 账号登录后,可在 Staging Repositories 中查看刚才已上传的构件,这些构件目前是放在 Staging 仓库中,可进行模糊查询,快速定位到自己的构件。此时,该构件的状态为 Open,需要勾选它,然后点击 Close 按钮。接下来系统会自动验证该构件是否满足指定要求,当验证完毕后,状态会变为 Closed,最后,点击 Release 按钮来发布该构件。

第八步:通知 Sonatype“构件已成功发布”

需要在曾经创建的 Issue 下面回复一条“构件已成功发布”的评论,这是为了通知 Sonatype 的工作人员为需要发布的构件做审批,发布后会关闭该 Issue。

第九步:等待构件审批通过

没错,还是要等,也许又是 1 ~ 2 天。同样,当审批通过后,将会收到邮件通知。

第十步:从中央仓库中搜索构件

最后,就可以到中央仓库中搜索到自己发布的构件了!


中央仓库网站检索:http://search.maven.org/




教程地址:http://blog.zhengshuiguang.com/java/maven-repository.html

欢迎转载!但请带上文章地址^^

标签:maven

评论已关闭