将 Java 项目推送到 Maven 中央仓库实践

将 Java 项目推送到 Maven 中央仓库实践

文章目录

  !版权声明:本博客内容均为原创,每篇博文作为知识积累,写博不易,转载请注明出处。


最新写了个开源项目 Swagger Kubernetes,考虑到发布到 Maven 中央仓库,发布成功,全球通用,在 Maven 拉取的过程中不存在 Jar 包不在无法下载的问题。由于第一次将项目提交到 Maven 中央仓库,网上知识参差不齐到最后遇见了很多坑,这里记录一下这个实践过程。

一、将项目推送到 Github

在 GitHub 上新建一个项目仓库,然后将要发送到 Maven 中央仓库的代码推送到 Github。这方面资料较多,这里不过多叙述。

二、注册 Sonatype 账户

进入 https://issues.sonatype.org/secure/Dashboard.jspa 注册JIRA账号,按提示完善个人信息。

三、登录 Sonatype 创建工单

登录 https://issues.sonatype.org/secure/Dashboard.jspa ,点击创建按钮来创建一个新的 issues 工单

内容如下,填写必填部分即可,然后等待审核。

四、确认域名

等待一段时间就会收到一封邮件,内容如下:

 1[ https://issues.sonatype.org/browse/OSSRH-48958?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
 2
 3Central OSSRH 更新了 OSSRH-48958:
 4------------------------------
 5状态: Waiting for Response  (原值: 开放)
 6
 7Do you own the domain mydlq.club? If so, please verify ownership via one of the following methods:
 8* Add a TXT record to your DNS referencing this JIRA ticket: OSSRH-48958 (Fastest)
 9* Setup a redirect to your Github page (if it does not already exist)
10
11If you do not own this domain, please read:
12http://central.sonatype.org/pages/choosing-your-coordinates.html
13You may also choose a groupId that reflects your project hosting, in this case, something like io.github.my-dlq or com.github.my-dlq
14
15Swagger Kubernetes is a program for document aggregation of Swagger standardized service apis in a Kubernetes cluster.
16----------------------------------------------------------------------------------------------------------------------
17
18关键字: OSSRH-48958
19URL: https://issues.sonatype.org/browse/OSSRH-48958
20项目: Community Support - Open Source Project Repository Hosting
21问题类型: New Project
22报告人: mydlq
23经办人: Joel Orlina
24优先级: 重要
25
26Swagger Kubernetes is a program for document aggregation of Swagger standardized service apis in a Kubernetes cluster. Service discovery under a Namespace of Kubernetes can be automatically performed. The interface of the Swagger API specification will be integrated and filtered. The service will be delegated to the service by zuul reverse proxy, and the Swagger API information will be aggregated and displayed by the Swagger UI.

意思就是询问你该 GroupId 设置的域名是否为你自己所拥有,如果是就需要证明一下,两种方法

  • 1、设置github page当做域名。
  • 2、在域名 DNS 解析中添加一条类型为 Txt 的记录。

由于本人有自己的域名,所以设置使用了第二种方法添加 NDS 解析记录,这里添加了记录为 OSSRH-48958,类型为 TxT,值为 https://issues.sonatype.org/browse/OSSRH-48958 的一条解析记录信息。

然后打开邮件中提到的地址 https://issues.sonatype.org/browse/OSSRH-48958 进入该 issues,在里面回复自己拥有该域名,且设置了 DNS 解析。

五、配置 GPG

1、下载 GPG

打开 https://www.gpg4win.org/ 下载 GPG,然后一步步安装。

安装完成后会看到桌面上多了个 Kleopatra 图标,这个程序是 GnuPG 的前端程序,这里我们将它打开。

2、配置密钥对

打开 Kleopatra 后,点击新建密钥对

输入姓名和邮箱

最后确认新建

过程中需要自己输入一个8位以上的密码,请记住该密码,后面还需要用到。 输入完成以后就会提示下面信息。

3、上传公钥到 GPS key-servers

打开命令提示符窗口,输入下面命令将证书发送到远程服务器

1gpg --keyserver hkp://keyserver.ubuntu.com:11371 --send-keys  243EFB60D8F930B391CA194EA40663B00BDC6CA1

六、配置项目

要想将项目发送到 Maven 中央仓库,需要对项目进行一些设置来符合发布条件。

1、配置 Strings.xml

配置 maven 目录 conf 文件夹中的 settings.xml 文件,设置一个 server,里面添加 JIRA 的账号和密码。

1<servers>
2   <server>
3      <id>ossrh</id>
4      <username>JIRA账号</username>
5      <password>JIRA密码</password>
6   </server>
7</servers>

2、配置 Pom.xml

Pom.xml 配置一些必要的信息,例如 Maven 文档插件、打包插件、GPG验证插件等,如下:

可以查看我的项目的 GitHub 地址: Maven 示例项目,pom 参数照着修改即可,顺便点下 Start 星,Thanks。

  1<?xml version="1.0" encoding="UTF-8"?>
  2<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4    <modelVersion>4.0.0</modelVersion>
  5
  6    <groupId>club.mydlq</groupId>
  7    <artifactId>swagger-kubernetes</artifactId>
  8    <version>2.1.0</version>
  9    <packaging>jar</packaging>
 10
 11    <name>swagger-kubernetes</name>
 12    <url>https://github.com/my-dlq/swagger-kubernetes</url>
 13    <description>swagger api doc for kubernetes discovery.</description>
 14
 15    <!--licenses信息-->
 16    <licenses>
 17        <license>
 18            <name>The Apache Software License, Version 2.0</name>
 19            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
 20            <distribution>repo</distribution>
 21        </license>
 22    </licenses>
 23
 24    <!--scm信息-->
 25    <scm>
 26        <url>http://mydlq.club</url>
 27        <connection>scm:git:https://github.com/my-dlq/swagger-kubernetes.git</connection>
 28        <developerConnection>scm:git:https://github.com/my-dlq/swagger-kubernetes.git</developerConnection>
 29    </scm>
 30
 31    <!--发布者信息-->
 32    <developers>
 33        <developer>
 34            <name>mydlq</name>
 35            <email>mynamedlq@163.com</email>
 36            <organization>http://mydlq.club</organization>
 37            <organizationUrl>http://mydlq.club</organizationUrl>
 38        </developer>
 39    </developers>
 40
 41    <properties>
 42        <java.version>1.8</java.version>
 43        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 44    </properties>
 45
 46    <dependencies>
 47        <dependency>
 48            <groupId>org.springframework.boot</groupId>
 49            <artifactId>spring-boot-starter-web</artifactId>
 50            <version>2.1.0.RELEASE<</version>
 51        </dependency>
 52    </dependencies>
 53
 54    <build>
 55        <plugins>
 56            <!-- doc plugin,Maven API文档生成插件 -->
 57            <plugin>
 58                <groupId>org.apache.maven.plugins</groupId>
 59                <artifactId>maven-javadoc-plugin</artifactId>
 60                <version>3.1.0</version>
 61                <executions>
 62                    <execution>
 63                        <id>attach-javadocs</id>
 64                        <goals>
 65                            <goal>jar</goal>
 66                        </goals>
 67                    </execution>
 68                </executions>
 69            </plugin>
 70            <!-- resources plugin,Maven 资源插件 -->
 71            <plugin>
 72                <groupId>org.apache.maven.plugins</groupId>
 73                <artifactId>maven-source-plugin</artifactId>
 74                <version>3.1.0</version>
 75                <executions>
 76                    <execution>
 77                        <id>attach-sources</id>
 78                        <goals>
 79                            <goal>jar-no-fork</goal>
 80                        </goals>
 81                    </execution>
 82                </executions>
 83            </plugin>
 84            <!-- compiler plugin,Maven 编译插件 -->
 85            <plugin>
 86                <groupId>org.apache.maven.plugins</groupId>
 87                <artifactId>maven-compiler-plugin</artifactId>
 88                <version>3.3</version>
 89                <configuration>
 90                    <source>${java.version}</source>
 91                    <target>${java.version}</target>
 92                    <showWarnings>true</showWarnings>
 93                </configuration>
 94            </plugin>
 95            <!-- gpg plugin,用于签名认证 -->
 96            <plugin>
 97                <groupId>org.apache.maven.plugins</groupId>
 98                <artifactId>maven-gpg-plugin</artifactId>
 99                <version>1.6</version>
100                <executions>
101                    <execution>
102                        <id>sign-artifacts</id>
103                        <phase>verify</phase>
104                        <goals>
105                            <goal>sign</goal>
106                        </goals>
107                    </execution>
108                </executions>
109            </plugin>
110            <!--staging puglin,用于自动执行发布阶段(免手动)-->
111  	         <plugin>
112                <groupId>org.sonatype.plugins</groupId>
113                <artifactId>nexus-staging-maven-plugin</artifactId>
114                <version>1.6.7</version>
115                <extensions>true</extensions>
116                <configuration>
117                    <serverId>ossrh</serverId>
118                    <nexusUrl>https://oss.sonatype.org/</nexusUrl>
119                    <autoReleaseAfterClose>true</autoReleaseAfterClose>
120                </configuration>
121            </plugin>
122            <!-- release plugin,用于发布到release仓库部署插件 -->
123            <plugin>
124                <groupId>org.apache.maven.plugins</groupId>
125                <artifactId>maven-release-plugin</artifactId>
126                <version>2.4.2</version>
127            </plugin>
128        </plugins>
129    </build>
130
131    <!-- 这里引入 Settings.xml 中设置的用户名、密码 -->
132    <distributionManagement>
133        <snapshotRepository>
134            <id>ossrh</id>
135            <url>https://oss.sonatype.org/content/repositories/snapshots</url>
136        </snapshotRepository>
137        <repository>
138            <id>ossrh</id>
139            <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
140        </repository>
141    </distributionManagement>
142
143</project>

3、设置编码

如果Maven编译doc因编码原因出错,可以在环境变量设置变量 JAVA_TOOL_OPTIONS,值为 UTF-8 来改变编码方式。

  • JAVA_TOOL_OPTIONS
  • -Dfile.encoding=UTF-8

七、发送项目到 Maven 中央仓库

1、登录 Nexus Repositories Manager

在发布之前要求必须有登录 Nexus Repositories 的信息,所以发布前提前登录 Nexus Repositories

登录 https://oss.sonatype.org 其中用户名、密码就是 JIRA 的用户名、密码。

2、发布项目

执行 maven 命令,部署项目到 Maven 仓库,过程中需要输入之前设置的 GPG 密码,输入一下即可。

1$ mvn clean deploy

3、查看发布过程

回到 Nexus Repositories Manager,选择 Staging Repositories 暂存库,根据发布时间查找到你提交的 Jar 信息。然后查看 Actives 里面的执行信息,注意执行部署过程现在流行都交给 Maven 自动部署插件执行,网上一些老办法是进入这里面手动执行,非常不推荐这样做,因为这样非常容易部署发生问题。

注意: 在 Maven 执行发布过程中才能看到,如果已经 release 完成,暂存库中可能找不到。

正常的部署流程应该为:open阶段—>close阶段—>release阶段 执行完成这三个阶段就会发布到中央仓库,等会会收到邮件通知

1[ https://issues.sonatype.org/browse/OSSRH-48958?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
2
3Central OSSRH 更新了 OSSRH-48958:
4------------------------------
5
6Central sync is activated for club.mydlq. After you successfully release, your component will be published to Central, typically within 10 minutes, though updates to search.maven.org can take up to two hours.

意思为 Release 成功,大概等十分钟或者几个就能在中央仓库查询到该 Jar 信息,不过对search.maven.org的更新可能需要两个小时。

4、在 Issues 中回复已经 Release 完成

打开之前提交 Issues 地址,后面回复已经 Release 完成

5、查看自己发布的项目

发布成功后可以进入 https://search.maven.org 网址查询自己发布的 Jar,如果未查到等几个小时再此查询。

---END---


  !版权声明:本博客内容均为原创,每篇博文作为知识积累,写博不易,转载请注明出处。