在Maven项目中,90%以上的jar包是通过pom文件直接从开源仓库中获取依赖jar包文件,然后在项目中进行集成使用。
此时如果你有一个开源项目,那么如何将该开源项目发布到Maven中央仓库,让其他人可以方便的使用,而不是先下载jar,然后install的本地?
本文将通过一步步的操作带领大家讲自己的开源项目发布到Maven中央仓库(Maven Central Repository)中,https://mvnrepository.com/。
Maven中央仓库并不支持直接发布jar包,需要将jar包发布到一些指定的第三方Maven仓库,然后该仓库再将jar包同步到Maven中央仓库,Sonatype便是这样的角色。
本文系统配置如下:1、操作系统macOS 10.14.2;2、JDK1.8.0_192;3、Maven:3.5.4。
准备工作
注册GitHub的账户,地址:https://github.com。既然是开源项目,肯定需要有一个地方托管,这里采用GitHub。
然后创建项目,上传对应的项目代码。
很多朋友已经有了GitHub的账户及开源项目,这几乎是程序员必备的一个平台,如果没有,赶紧去开通一个。
注册Sonatype的账户
Sonatype通过JIRA来管理OSSRH仓库。JIRA是一个项目管理服务,类似于国内的Teambition。
注册地址:https://issues.sonatype.org/secure/Signup!default.jspa
其中,Username便是登录名称,Password为登录密码,它俩是一套。
【友情提示】密码校验非常苛刻,最好用记事本记录备忘。
注册完成,首次登录会让选择语言,这里本人选择了中文。
项目的发布申请
首次登录Sonatype会直接跳转到创建页面,之后登录创建发布项目申请需点击导航栏的“新建”进行项目或问题的创建发布。
新しいjarパッケージのリリースを申請するためにJIRAで課題を作成することにより、Sonatypeスタッフがそれを確認します。通常、必要に応じて記入することは問題ありません。
上の画像の中国語版を要求するときに情報を入力します。プロジェクトは「コミュニティサポート」の項目を選択し、対応する質問タイプは「新規プロジェクト」である必要があります。上記の選択に応じて、対応するGroupIdおよびプロジェクト情報が下に表示されます。
プロジェクトURLは、プロジェクトのURLアドレスです。これは、GitHubプロジェクトにアクセスするときのブラウザーのURLです。例:https://github.com/secbr/fastdfs-client-plus
SCM urlは、Httpsに基づいてソースコードにアクセスするためのリンクです。GitHubのソースコードを入手する方法はたくさんあることは承知しています。zipパッケージをダウンロードして、「Use ssh」、「Use Https」などからダウンロードできます。ここでのSCM URLは、https:// githubなどのHttpsのURLアドレスです。 com / secbr / fastdfs-client-plus.git
その他の不要な情報は、必要に応じて入力できます。
提出が完了すると、課題が作成され、コンテンツは次のように表示されます。
明らかに、それは現在「保留中」の状態にあり、レビューを待っています。この記事を書いてから10分以上経過した後、公式レビュー担当者は「応答を待っています」と回答しました。同時に、対応するプロンプトコメント情報が[問題]に表示されます。
これは主に、上記のGroupIdを検証して、対応するドメイン名が自分が所有しているかどうかを判断するためのものです。たとえば、ここに入力されるGroupIdはtop.folenです。次に、検証が必要なドメイン名はfolen.topです。
コメントには2つの検証方法が記載されています。1つは必要に応じてDNSを構成する方法で、もう1つはGitHubの第2レベルドメイン名を直接使用する方法です。
ここでようやく、GitHubの第2レベルドメイン名をGroupIDとして使用することを選択しました。現時点では、公式の返信は次のとおりです。
プラットフォームにGitHubのアカウント権限があるかどうかを確認するには、申請者はGitHubに「OSSRH-59503」という名前のプロジェクトを作成する必要があります。GitHubでそのような空のプロジェクトを作成し、コメント領域で返信します。
返信が完了したら、しばらく待ってからレビューが完了します。
整个上述过程用大概40分钟,官方回复的还比较及时,由于是下午四五点进行操作的,不确定大家在操作时是否会遇到时差问题。大家可在主面板上查看一下最近其他人提交的Issues的回复情况来确认是否等待。
安装并配置GPG
发布到Maven仓库中的所有文件都要使用GPG签名,以保障完整性。因此,我们需要在本地安装并配置GPG。
本人采用Mac操作系统,关于其他操作系统的安装大家自行搜索。
MacBook安装GPG非常简单,下载并安装GPG Suite即可:https://gpgtools.org/
安装完成可进入创建GPG密钥对的操作界面,Mac下安装完成弹出如下页面:
生成密钥时将需要输入name、email以及password。秘钥password在之后的步骤需要用到,请记下来。
公钥创建完成,会自动弹出上传到公共的密钥服务器,这样其他人才可以通过公钥来验证jar包的完整性。
如果忘记了公钥信息可执行gpg --list-keys命令查看本地公钥信息。
192:~ zzs$ gpg --list-keys
/Users/zzs/.gnupg/pubring.kbx
-----------------------------
pub dsa2048 2010-08-19 [SC] [过期于:2020-06-15]
85E38F69046B44C1EC9FB07B76D78F0500D026C4
uid [ 已过期 ] GPGTools Team <[email protected]>
pub rsa4096 2020-05-04 [SC] [有效至:2024-05-03]
B97E9964ACAD1907970D37CC8A9E3745558E41AF
uid [ 未知 ] GPGTools Support <[email protected]>
sub rsa4096 2020-05-04 [E] [有效至:2024-05-03]
pub rsa4096 2020-07-27 [SC] [有效至:2024-07-27]
74C31F28121A99A6E28C234148FEC679B82EF754
uid [ 绝对 ] secbro <[email protected]>
sub rsa4096 2020-07-27 [E] [有效至:2024-07-27]
也可以通过如下形式将公钥信息上传到服务器:
gpg --keyserver hkp://keyserver.ubuntu.com:11371 --send-keys B97E9964ACAD1907970D37CC8A9E3745558E41AF
其中B97E9964ACAD1907970D37CC8A9E3745558E41AF便是上面查询到的。
如果是Windows操作系统,同样安装完软件,打开cmd命令行,执行gpg --gen-key生成key,执行gpg --list-keys查看key列表,执行上述命令上传key。
配置Maven的setting.xml
setting.xml为Maven的全局配置文件,路径为$MAVEN_HOME/conf/settings.xml,需要注册Sonatype的账户时配置的Username和Password添加到servers标签中,这样才能将jar包部署到Sonatype OSSRH仓库:
<server>
<id>sonatype-nexus-snapshots</id>
<username>Sonatype账号</username>
<password>Sonatype密码</password>
</server>
配置项目的pom.xml
根据Sonatype OSSRH的要求,以下信息都必须配置:
- Supply Javadoc and Sources
- Sign Files with GPG/PGP
- Sufficient Metadata
- 正しい座標
- プロジェクト名、説明、URL
- ライセンス情報
- 開発者情報
- SCM情報
オープンソースライセンス契約、SCM情報、開発者情報を追加し、独自の情報に従って入力するのを待ちます。
<licenses>
<license>
<name>BSD 3-Clause</name>
<url>https://spdx.org/licenses/BSD-3-Clause.html</url>
</license>
</licenses>
<scm>
<connection>https://github.com/secbr/fastdfs-client-plus.git</connection>
<url>https://github.com/secbr/fastdfs-client-plus</url>
</scm>
<developers>
<developer>
<name>secbr</name>
<email>[email protected]</email>
<roles>
<role>Developer</role>
</roles>
<timezone>+8</timezone>
</developer>
</developers>
リリースバージョンをリリースする場合は、リリースの関連プロファイル構成を追加し、実際の状況に応じてdistributionManagementセクションとmaven-compiler-pluginセクションの構成情報を変更する必要があります。
<profiles>
<profile>
<id>release</id>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.sample</include>
</includes>
</resource>
</resources>
<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>
<configuration>
<show>private</show>
<nohelp>true</nohelp>
<charset>UTF-8</charset>
<encoding>UTF-8</encoding>
<docencoding>UTF-8</docencoding>
<additionalparam>-Xdoclint:none</additionalparam>
<javadocExecutable>/Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home/bin/javadoc</javadocExecutable>
<!-- TODO 临时解决不规范的javadoc生成报错,后面要规范化后把这行去掉 -->
</configuration>
<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.6</version>
<executions>
<execution>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
<!--Compiler -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<fork>true</fork>
<verbose>true</verbose>
<encoding>UTF-8</encoding>
<showWarnings>false</showWarnings>
</configuration>
</plugin>
<!--Release -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.5.1</version>
</plugin>
</plugins>
</build>
<distributionManagement>
<snapshotRepository>
<id>sonatype-nexus-snapshots</id>
<name>Sonatype Nexus Snapshots</name>
<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
</snapshotRepository>
<repository>
<id>sonatype-nexus-snapshots</id>
<name>Nexus Release Repository</name>
<url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
</repository>
</distributionManagement>
</profile>
</profiles>
snapshotRepositoryは、setting.xmlで定義されたサーバーのIDです。
JARパッケージの公開
上記の構成が完了したら、コマンドを使用してパッケージ化してアップロードし、jarパッケージをSonatype OSSRHウェアハウスに公開できます。
mvn clean deploy -P release
上記のコマンドを実行し、パッケージ化してアップロードします。releaseは、上記で構成されたプロファイル要素のIDです。
実行の過程で、上記で設定したキーパスワードを入力する必要があります。図は、実行が成功したことを示すコンソールの表示です。
[フレンドリーなヒント]パッケージングプロセス中に401エラーが発生した場合は、Maven構成ファイルのサーバーノードで構成されたユーザー名とパスワードが正しくないか、問題が承認されていない可能性があります。
この時点で上記のリンクのいずれかにアクセスして、対応する情報を問い合わせてください。たとえば、URL内の特定のファイルを削除し、次のパスのみを残します。https://oss.sonatype.org/content/repositories/snapshots/com/github/secbr/fastdfs-client-plus/1.0.0-SNAPSHOT/
上記のパスにアクセスすると、アップロードされたすべてのファイル情報を表示できます。
リリースjarパッケージを表示
この時点で、https://oss.sonatype.org/#stagingRepositoriesにアクセスしてリリースされたコンポーネントを表示し、左側のステージングリポジトリをクリックします。グループIDまたはその他の情報を使用して、独自のプロジェクトを検索できます。
ユーザー名またはパスワードがポップアップする場合は、sonatypeを登録するときに、対応するユーザーとパスワードの情報を入力します。
この時点で、プロジェクトのバージョン情報が1.0.0-SNAPSHOTの場合、つまりSNAPSHOTがサフィックスである場合、公開されたプロジェクトはスナップショットディレクトリにあることに注意してください。左上のアーティファクト検索で見つけることができます。
リリースサフィックスの場合は、ステージングリポジトリで直接確認できます(プラットフォームで処理されるのを待つ間、少し待たなければならない場合があります)。
リポジトリを選択したら、[閉じる]をクリックします。閉じると、公開されたコンポーネントが要件を満たしているかどうかがチェックされます。要件を満たしていれば、クローズは成功です。成功したら、矢印で示されたリリースをクリックして、jarパッケージをSonatype OSSRHウェアハウスに正式にリリースします。
[リリース]をクリックすると、問題の変更に関するメッセージが電子メールで受信され、同期がアクティブ化され、同期は10分以内に更新されます。
リリースが成功してから約2時間後に、コンポーネントがMaven中央倉庫に同期され、電子メール通知が送信されます。
実際には、10分以内にhttps://repo1.maven.org/の中央倉庫に正常に同期されていることがわかりました。
徐々に、Aliミラーを含む他のMavenリポジトリーが同期されます。
エンディング
Maven中央倉庫へのリリースが完了し、対応するJarパッケージが表示されたら、送信した課題にコメントを追加し、感謝のメッセージを残して、リリースが完了したことを示し、課題を閉じてください。始まりと終わりがあります。
プログラマーとして、中央のMavenウェアハウスに独自のコードのセットがついに登場するのはエキサイティングですか?
元のリンク:「プロジェクトをMavenセントラルウェアハウスに公開する方法 》