您的浏览器过于古老 & 陈旧。为了更好的访问体验, 请 升级你的浏览器
Ready 发布于2019年06月04日 19:10 最近更新于 2019年06月15日 11:06

原创 发布Java jar包到Maven中央仓库

5398 次浏览 读完需要≈ 24 分钟 MavenJava

内容目录

本文主要介绍如何发布自己的jar文件到Maven中央仓库,使用到的所有插件均为当前最新版本(有些旧的方法可能已经过时)。

注册Maven账号

由于Maven 中央仓库是由企业Sonatype,Inc.负责运营维护的,因此你需要先前往 https://issues.sonatype.org/secure/Signup!default.jspa 注册一个账号(如果你已经有了账号,可以跳过此步骤)。

新建 Sonatype Issue

登录了账号之后,你需要新建一个IssueIssue是问题的意思,相当于你提交了一个工单给 Sonatype 的工作人员,申请开通Maven中央仓库的发布权限。

点击顶部的【新建】按钮,填写申请表单,即可提交申请。

图片.png

请根据实际情况填写申请表单
请根据实际情况填写申请表单

注意groupId 不能随意填写。

  • 如果你(或所属机构)拥有自己的域名,可以填写自己的域名。工作人员在审核时,会反馈给你,要求验证域名的所有权,你可以采取如下两种方式之一完成验证:1、 为域名添加一个指向 Issue编号 的TXT记录; 2、将域名的访问重定向到你的项目主页地址(Project URL)。
  • 如果你没有自己的域名,你只能使用项目托管方的域名。例如 你的项目在Github ,主页地址为 https://github.com/username/projectName,那么你只能使用 io.github.usernamecom.github.username 作为groupId

提交成功后,你需要耐心等待审核。不过,请不用担心,Sonatype工作人员的审核效率是很高的,工作时间范围内,基本上一小时内就会响应。

提醒:需要验证域名所有权的情况下,记得在完成对应的域名解析记录操作后,回到Issue详情页面,点击【Respond】按钮,以通知工作人员进行再次审核。

装OpenPGP程序,创建密钥对

稍后在发布jar文件的时候,我们需要用到OpenPGP程序来对所有文件进行签名。便于其他用户在下载你的jar文件时进行校验,防止文件被恶意篡改。PGP的官方下载地址为:https://www.gnupg.org/download/#binary,你可以自行根据当前操作系统下载对应版本的安装程序 。

在这里,我们下载的是 Gpg4win 。安装完毕后,打开它自带的图形界面工具【Kleopatra】,点击左上角工具栏的【文件】->【新建密钥对】。

图片.png

选择默认的第一个选项
选择默认的第一个选项

接着,填写你的个人信息(选填):

图片.png

然后点击【下一步】->【新建】,之后程序要弹窗要求你输入 passphrase (这是密码,请牢记,下面要用到):

图片.png

接着点击【OK】,你的密钥对就已经创建好了。最后,我们需要将密钥对中的公钥发布到 OpenPGP 的共用服务器上。选中我们刚才创建的密钥对,点击鼠标右键,在关联菜单中选择【在服务器上发布】即可。

选择标记处的菜单项
选择标记处的菜单项

准备发布jar包

通过审核之后,现在就该轮到你准备 deploy 你的jar包到 Maven 中央仓库了。

此时,我们先简单介绍一下从项目打包到最终发布完成的大致流程步骤:

  1. 使用相关的 Maven 插件将项目编译并打包成对应的字节码jar包(<name>-<version>-RELEASE.jar)、源代码jar包(<name>-<version>-RELEASE-sources.jar)、javadoc文件(<name>-<version>-RELEASE-javadoc.jar)。
  2. 使用 gpg 对上述jar文件进行签名。便于其他用户在下载文件时进行校验,防止文件被恶意篡改。
  3. 将上述所有文件发布到 https://oss.sonatype.org 的 Nexus 仓库。
  4. 上传成功后,登录你的 https://issues.sonatype.org 账号,回到你之前申请的 Issue 工单详情页面,提交评论告知 Sonatype 的工作人员:你已经成功发布了第一个版本(内容随意,大概表达了类似的意思即可),工作人员将会复审你的发布内容。审核通过后,你的项目jar文件就已经成功发布到 Maven Central 中央仓库了。

现在,我们正式动工。在对应项目的pom.xml文件中添加如下相应配置片段:

<licenses>
	<license> <!-- 自行修改为对应的LICENSE声明 -->
		<name>The Apache License, Version 2.0</name>
		<url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
		<distribution>repo</distribution>
	</license>
</licenses>

<developers>
	<developer> <!-- 可以有多个 -->
		<name>开发者名称</name>
		<email>邮箱地址</email>
		<organization>所属机构</organization>
	</developer>
</developers>

<scm>
	<url>项目的SVN或Git地址,例如:https:// github.com/CodePlayer/ready-x/tree/master</url>
	<connection>scm:git:git://@github.com:CodePlayer/ready-x.git</connection>
	<developerConnection>scm:git:ssh://git@github.com:CodePlayer/ready-x.git</developerConnection>
	<tag>master</tag>
</scm>

上述部分配置,用于完善项目的权属声明。接着,我们继续添加如下部分的插件配置信息到pom.xml中。

<profiles>
	<profile>
		<id>ossrh</id> <!-- profile的id -->

		<!-- 配置发布到的远程Nexus仓库地址 -->
		<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>

		<build>
			<plugins>

				<!-- 编译打包项目源代码为字节码jar文件,你懂的 -->
				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-compiler-plugin</artifactId>
					<version>3.8.1</version>
					<configuration>
						<debuglevel>lines,vars,source</debuglevel>
					</configuration>
				</plugin>

				<!-- 打包项目源代码为jar文件,你懂的 -->
				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-source-plugin</artifactId>
					<version>3.1.0</version>
					<executions>
						<execution>
							<id>attach-sources</id>
							<goals>
								<goal>jar-no-fork</goal>
							</goals>
						</execution>
					</executions>
				</plugin>

				<!-- 打包项目javadoc注释为jar文件,你懂的 -->	
				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-javadoc-plugin</artifactId>
					<version>3.1.0</version>
					<configuration>
						<encoding>UTF-8</encoding>
						<doclint>none</doclint>
					</configuration>
					<executions>
						<execution>
							<id>attach-javadocs</id>
							<goals>
								<goal>jar</goal>
							</goals>
						</execution>
					</executions>
				</plugin>

				<!-- 用于将所有jar文件部署至远程仓库的插件 -->
				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<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>

				<!-- 用于对所有文件进行签名 -->
				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-gpg-plugin</artifactId>
					<version>1.6</version>
					<configuration>
						<executable>gpg</executable> <!-- 该参数值取决于你的gpg程序在命令行中的名称,一般是"gpg"或"gpg2" -->
					</configuration>
					<executions>
						<execution>
							<id>sign-artifacts</id>
							<phase>verify</phase>
							<goals>
								<goal>sign</goal>
							</goals>
						</execution>
					</executions>
				</plugin>

				<!-- 用于将文件阶段性发布到远程 Nexus 仓库 -->
				<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://oss.sonatype.org/</nexusUrl>
						<autoReleaseAfterClose>true</autoReleaseAfterClose>
					</configuration>
				</plugin>

				</plugins>
			</build>
		</profile>

</profiles>

注意,在这里我们使用了 Maven Profile,profile 的 id 为ossrh,以免与你其它用途的插件配置产生冲突。

接着,我们打开Maven安装目录下的配置文件conf/settings.xml,在对应的XML节点处添加如下配置片段:

 <servers>

    <server>
		<id>ossrh</id>
		<username>你注册的sonatype账户名</username>
		<password>对应的密码</password>
    </server>

</servers>


<profiles>
	<profile>
		<id>ossrh</id>		
		<properties>
			<gpg.passphrase>你刚刚设置的PGP passphrase</gpg.passphrase>
		</properties>
	</profile>
</profiles>

最后,我们执行以下Maven命令,即可完成 deploy 到 OSS Nexus 仓库的所有步骤:

mvn clean deploy -P ossrh

如果你使用的是Eclipse,可以使用对应的 Maven命令图形界面:

Eclipse的Maven命令图形界面
Eclipse的Maven命令图形界面

最后,你只需要按照上述步骤中所说的那样,登录你的 https://issues.sonatype.org 账号,回到你之前申请的 Issue 工单详情页面,提交评论告知 Sonatype 的工作人员:你已经成功发布了第一个版本(内容随意,大概表达了类似的意思即可),工作人员将会复审你的发布内容。审核通过后,你的项目jar文件就已经成功发布到 Maven Central 中央仓库了。

本文主要参考 Maven 官方提供的相关英文文档: https://central.sonatype.org/pages/producers.html

  • CodePlayer技术交流群1
  • CodePlayer技术交流群2

1 条评论

Ready [作者] · 4年前

额外补丁强调一句:在执行 Maven deploy 命令时,一定要先执行 clean 命令,也就是 mvn clean deploy,否则可能无法发布成功。

0 0 0

撰写评论