如何将自己的开源项目发布到Maven中央仓库中?

  如何将自己代码发布到Maven中央仓库?这样,别人就可以通过简单的Maven配置通过互联网获取到你发布的Jar包,比如要使用Jdon框架,只要在maven的pom.xml中配置:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
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>wwww</groupId>
<artifactId>wwww</artifactId>
<version>1.0-SNAPSHOT</version>

<dependencies>
<dependency>
<groupId>org.jdon</groupId>
<artifactId>jdonframework</artifactId>
<version>6.9</version>
</dependency>
</dependencies>
</project>

 

其中关键依赖配置是:

<dependency>
<groupId>org.jdon</groupId>
<artifactId>jdonframework</artifactId>
<version>6.9</version>
</dependency>

如果你不知道groupId怎么写,只知道jdonframework,那么在https://mvnrepository.com/search?q=jdonframework 网站搜索,就可以获得结果:

上面演示了如果你的项目发布到中央仓库后,是如何被使用的,下面切入正题,那么如何发布到中央仓库呢?

准备阶段

  Sonatype的开源软件存储库托管(OSSRH)服务是项目所有者和贡献者将其组件发布到中央存储库的主要途径。它是Nexus Repository Manager的托管部署,其中 Nexus Staging Suite 用于部署过程和验证,并与Maven中央仓库内容交付网络的同步过程相结合。

  也就是说,我们需要把我们的项目发布到OSSRH,然后使用其Nexus Staging Suite实现部署和验证,发布成功后,就会和中央仓库同步。

下面是先决条件:

第1步:  确保您是否安装了JDK,Maven,Github等。

第2步: 创建Github帐户(如果尚未创建)。

第3步:  创建一个新的Github存储库。

第4步: 向您的Github帐户添加新的SSH密钥

第5步:  将代码推送到Github。 (以上步骤是确保你项目在Github,如果已经有可忽视)

第6步:  注册Sonatype Jira帐户。记住你的用户名和密码,后面需要在maven的settings.xml中设置

第7步: 为新项目托管创建Jira问题点击此处获取样品申请。,也就是为你的项目提交一个说明:

注意其中groupId设置比较重要,决定了别人使用你的库包时的pom.xml中groupId。

第8步:安装GNU PG。  在您的操作系统中安装并验证如下:

$ gpg --version

第9步: 生成密钥对。

gpg --full-gen-key

gpg --full-gen-key
gpg (GnuPG) 2.1.15; Copyright (C) 2016 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
gpg: keybox 'C:/Users/Nadeem/AppData/Roaming/gnupg/pubring.kbx' created
Please select what kind of key you want:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
Your selection? 1
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)
Requested keysize is 2048 bits
Please specify how long the key should be valid.
0 = key does not expire
<n>= key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0)
Key does not expire at all
Is this correct? (y/N) y

第10步: 输入 passphrase.,最好设置passphrase,记住你设置的值,在后面Maven的settings.xml中需要用到,包括deploy发布时,需要输入这个值。

第11步:设置好加密密钥后,需要发布到OSSRH服务器上,因为,你会使用这个密钥加密你的jar包,当你上传你的jar包到OSSRH服务器时,它就会用它来解密。

$gpg --list-key

pub   rsa2048 2018-09-22 [SC]
16D6529CF8C6A54F4C4806333909DEEC673E94A8
uid [ultimate] Peng ChenYang <banq@163.com>
sub rsa2048 2018-09-22 [E]

这里16D6529CF8C6A54F4C4806333909DEEC673E94A8就是你的key的Id,

$ gpg --keyserver hkp://pool.sks-keyservers.net --send-keys 16D6529CF8C6A54F4C4806333909DEEC673E94A8

这样就把你的密钥上传到pool.sks-keyservers.net ,但是具体服务器需要根据当时OSSRH提示,如果在后面发布时,它提示你没有上传密钥到http://keyserver.ubuntu.com:11371/,那么你就要上传密钥到这个服务器:

$ gpg --keyserver hhttp://keyserver.ubuntu.com:11371 -send-keys 16D6529CF8C6A54F4C4806333909DEEC673E94A8

值得注意的是,下面发布过程重要的两个步骤是:必须生成JavaDoc,必须对你的项目用这个密钥加密。这两个条件缺一不可,否则会报错。

 

部署发布过程

这个过程有两个阶段配置,部署deploy阶段和发布release阶段,主要是配置Maven的pom.xml,可参考已经配置好的样板pom.xml

这个部署发布流程涉及这几个步骤,比较繁多:deploy配置、Nexus staging Maven plugin配置、javadoc配置、加密配置、发布配置。

配置会涉及两个配置文件,一个是你的项目下的pom.xml,还有一个是Maven全局配置settings.xml,如果是windows,一般在c盘用户目录下的.m2目录。注意有的人会将settings.xml配置放在别处。

第1步:首先,需要配置部署deploy阶段的Maven配置,向POM添加分布式管理部分,

<distributionManagement>
<snapshotRepository>
<id>ossrh</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
</snapshotRepository>


</distributionManagement>

这个distributionManagement是和dependencies和build一样是一级目录,同样下面加入下面scm也是一级目录:

<scm>
<connection>scm:git:git@github.com:banq/jdonframework.git</connection>
<developerConnection>scm:git:git@github.com:banq/jdonframework.git</developerConnection>
<url>git@github.com:banq/jdonframework.git</url>
<tag>jdonframework-6.9</tag>
</scm>

 

添加deploy插件、sonatype的staging插件、release插件和SCM插件四个插件plugin加入到build的plugins里面:

(1) deploy插件

<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
<executions>
<execution>
<id>default-deploy</id>
<phase>deploy</phase>
<goals>
<goal>deploy</goal>
</goals>
</execution>
</executions>
</plugin>
(2)sonatype的staging插件
<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
<version>1.6.7</version>
<extensions>true</extensions>
<configuration>
<serverId>ossrh</serverId>
<nexusUrl>https://oss.sonatype.org/</nexusUrl>
<autoReleaseAfterClose>true</autoReleaseAfterClose>
</configuration>
</plugin>

(3)SCM插件

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-scm-plugin</artifactId>
<version>1.8.1</version>
</plugin>

(4)release插件,下面checkModificationExcludes是排除一些目录文件不要发布。

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.5.3</version>
<configuration>
<mavenExecutorId>forked-path</mavenExecutorId>
<useReleaseProfile>false</useReleaseProfile>
<arguments>-Psonatype-oss-release</arguments>
<pushChanges>false</pushChanges>
<localCheckout>false</localCheckout>
<autoVersionSubmodules>true</autoVersionSubmodules>
<checkModificationExcludes>
<checkModificationExclude>.idea/</checkModificationExclude>
<checkModificationExclude>.idea/*</checkModificationExclude>
<checkModificationExclude>.idea/libraries/*</checkModificationExclude>
<checkModificationExclude>pom.xml</checkModificationExclude>
<checkModificationExclude>release-pom.xml</checkModificationExclude>

<checkModificationExclude>jdonframework.iml</checkModificationExclude>
<checkModificationExclude>JdonAccessory/jdon-hibernate3x/jdon-hibernate3x.iml</checkModificationExclude>
<checkModificationExclude>JdonAccessory/jdon-jdbc/jdon-jdbc.iml</checkModificationExclude>
<checkModificationExclude>JdonAccessory/jdon-remote/jdon-remote.iml</checkModificationExclude>
<checkModificationExclude>JdonAccessory/jdon-struts1x/jdon-struts1x.iml</checkModificationExclude>

</checkModificationExcludes>
</configuration>
<dependencies>
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-scm-plugin</artifactId>
<version>1.8.1</version>
</dependency>
</dependencies>
</plugin>

 

以上pom.xml配置将获取用户帐户详细信息以从Maven settings.xml文件部署到OSSRH,这时需要你在前面注册Sonatype Jira帐户提供的用户名和密码,用户名和密码配置在settings.xml中,不是在自己项目的pom.xml中:

<server>
<id>ossrh</id>
<username>用户名</username>
<password>密码</password>
</server>

注意这段配置是在settings.xml的一级目录<servers>里面。

第2步:生成Javadoc和Source jar文件,您必须配置javadoc和源Maven插件。在pom.xml的build一级目录下的plugins里面加入下面:

  <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.1.2</version>
<executions>
<execution>
<id>attach-sources</id>
<phase>verify</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.9.1</version>
<configuration>
<aggregate>true</aggregate>
<charset>UTF-8</charset>
<encoding>UTF-8</encoding>
<docencoding>UTF-8</docencoding>
<additionalparam>-Xdoclint:none</additionalparam>
</configuration>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>

上面Xdoclint:none是让maven忽视javadoc过程中警告和错误,否则无法正常进行。

第3步:进行GPG签名加密,这是对生成的jar包,javadoc包等进行签名加密,保证你的文件上传到服务器过程中不会被拦截和破解安全,服务器那边使用你提供的密钥对进行解密。在pom.xml的build一级目录下的plugins里面加入下面:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>

Maven会使用你之前设置的密钥对进行加密打包,那么你需要把你的密钥对告诉Maven,那么需要在settings.xml配置GPG密钥方面的关键信息,在profiles一级目录下配置:

<profile>
<id>ossrh</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<gpg.executable>gpg</gpg.executable>
<gpg.passphrase>前面准备阶段第10步设置的passphrase</gpg.passphrase>
<gpg.executable>d:\Program Files (x86)\Gpg4win\..\GnuPG\bin\gpg.exe</gpg.executable>
<gpg.homedir>C:/Users/banq/AppData/Roaming/gnupg</gpg.homedir>
</properties>
</profile>
<profile>

注意到:

<gpg.executable>d:\Program Files (x86)\Gpg4win\..\GnuPG\bin\gpg.exe</gpg.executable>
<gpg.homedir>C:/Users/banq/AppData/Roaming/gnupg</gpg.homedir>

这两行是告诉Maven,你下载的gpg在哪个目录,你的加密好的密钥对放在哪里,前面是gpg安装好的目录,后面是通过执行gpg --list-key发现的。

 

收尾过程

  现在都已经配置好了,现在可以部署发布了。

第1步:运行下面命令,或者在Idea里面运行deploy:

mvn clean deploy

  注意,在运行之前检查一下你的版本,版本号非常重要,服务器那边对版本号有状态跟踪,同一个版本发布成功后就不能上传了。在pom.xml头部:

<modelVersion>4.0.0</modelVersion>
<groupId>org.jdon</groupId>
<artifactId>jdonframework</artifactId>
<version>6.9</version>

这里版本号写你要发布的正式版本号,不用带有:

<version>1.0-SNAPSHOT</version>

否则服务器那边处理会不同,遭遇各种坑。

第2步: 浏览到https://oss.sonatype.org/index.html#stagingRepositories,管理你的发布上传的项目,如果这个网址没有,这是进入https://oss.sonatype.org/以后,寻找

右边会出现很多列表,如何找到自己的项目?在列表右上角搜索中输入你的项目关键字,如jdon,

选择项目后,再点按Close,就完成Release,或者再按一次Release按钮就完成发布了。

当然这个过程不可能一帆风顺,可能会出现下面错误:

这两个错误详细信息会显示签名错误或Javadoc文档没有提供,检查签名签名插件和生成javadoc文档插件是否在你的pom.xml正确位置。

第3步:验证, 访问:https://repo.maven.apache.org/maven2,如果你的项目是org.jdon格式,那么进入org,再进入jdon,应该能发现你发布的版本:

或者到一个新的Maven环境下,在pom.xml中加入你的新版本配置以后,进行mvn install等操作,是否拉取成功?

自己搭建Maven服务器私服

教程首页

Jdon框架文档

敏捷