將 Smart 構件發佈到 Maven 中央倉庫

不少朋友都給我提過一樣的建議:java

建議把 Smart 的 jar 包放到 Maven 中央倉庫吧!放在 OSC Maven 裏我下載不到。git

須要澄清的是,並非從 OSC Maven 下載不到 Smart 構件,而是這些構件屬於第三方構件,存放在 OSC Maven 的第三方倉庫裏,因此咱們須要在 pom.xml 或 setting.xml 裏配置:apache

<!-- lang: xml -->
<repository>
    <id>osc_thirdparty</id>
    <url>http://maven.oschina.net/content/repositories/thirdparty/</url>
</repository>

然而,不少朋友並不知道須要這樣配置,因此就產生了那個建議。服務器

此外,須要注意的是,OSC Maven 的第三方倉庫只能存放 RELEASE 構件,而不能存放 SNAPSHOT 構件。jsp

爲了讓你們可以更方便的使用 Smart,我作了一個慎重的決定:將 Smart 構件發佈到 Maven 中央倉庫中!maven

將構件放入中央倉庫是一件很是麻煩的事情,須要作不少準備工做,我會盡量有條理地展示每一個步驟,就是爲了讓你們少走彎路,節省更多的時間,去作更重要的事情。ide

如今就開始吧!工具


說到中央倉庫,不得不說 Sonatype 這家公司,由於中央倉庫就是這家公司砸錢搞的,而且免費向全球全部的 Java 開發者提供構件託管服務,這對於咱們而言,簡直就是「福利」啊!網站

Sonatype 官網:http://www.sonatype.org/ui

對於向我這樣的新手而言,第一次將構件發佈到中央倉庫,真的不是一件很是輕鬆的事情,因此如今很是有必要把些步驟記下來,這樣能夠節省你們的時間,作更多重要的事情。

具體的操做步驟以下:

第一步:註冊一個 Sonatype 用戶

註冊地址:https://issues.sonatype.org/secure/Signup!default.jspa

這裏的用戶名與密碼是很是重要的,後面會用到,必定要保存好。

此外,Sonatype 還提供了一個名爲 OSS 的系統:

Sonatype OSS:https://oss.sonatype.org

在 OSS 中能夠查詢到全世界已發佈的構件,固然它還有另一個做用,後面會提到。

第二步:建立一個 Issue

Issue 地址:https://issues.sonatype.org/secure/CreateIssue.jspa?issuetype=21&pid=10134

此時,至關於提交一個申請。其中,最重要的信息就是 groupId 了,對於這個 groupId,我必要多說幾句:

由於個人 Smart 項目源碼託管在 OSC Git 上,其域名爲 oschina.net,因此 Smart 的 groupId 應該是 net.oschina.huangyong。很明顯,這種 groupId 不是我想要的,因此我須要購買一個屬於 Smart 的域名。

由於 Smart 是一個開源項目,屬於非盈利組織,因此域名後綴應該是 org 的,因而第一反應是想買 smart.org 域名。在 萬網 上查詢了一下,發現這個域名已經被人買了,沒辦法,只能換一個域名了。經你們一番討論後,決定 Smart 的域名爲 smart4j.org,在萬網上的價格是 139 元/年。經 大漠 的推薦,最後在 GoDaddy 上以 87 元/年的價格購買了該域名,在 GoDaddy 上是可使用支付寶交易的。

這樣一來,Smart 在中央倉庫裏就能夠申請到名爲 org.smart4j 的 groupId 了。

第三步:等待 Issue 審批經過

通常須要 1 ~ 2 天時間,須要耐心等候,審批經過後會發郵件通知,此外,在本身提交的 Issue 下面會看到 Sonatype 工做人員的回覆。

第四步:使用 GPG 生成密鑰對

若是是 Windows 操做系統,須要下載 Gpg4win 軟件來生成密鑰對。建議你們下載 Gpg4win-Vanilla 版本,由於它僅包括 GnuPG,這個工具纔是咱們所須要的。

安裝 GPG 軟件後,打開命令行窗口,依次作如下操做:

1. 查看是否安裝成功

gpg --version

可以顯示 GPG 的版本信息,說明安裝成功了。

2. 生成密鑰對

gpg --gen-key

此時須要輸入姓名、郵箱等字段,其它字段可以使用默認值,此外,還須要輸入一個 Passphase,至關於一個密鑰庫的密碼,必定不要忘了,也不要告訴別人,最好記下來,由於後面會用到。

3. 查看公鑰

gpg --list-keys

輸出以下信息:

C:/Users/huangyong/AppData/Roaming/gnupg/pubring.gpg
----------------------------------------------------
pub   2048R/82DC852E 2014-04-24
uid                  hy_think <hy_think@163.com>
sub   2048R/3ACA39AF 2014-04-24

可見這裏的公鑰的 ID 是:82DC852E,很明顯是一個 16 進制的數字,立刻就會用到。

4. 將公鑰發佈到 PGP 密鑰服務器

gpg --keyserver hkp://pool.sks-keyservers.net --send-keys 82DC852E

此後,可以使用本地的私鑰來對上傳構件進行數字簽名,而下載該構件的用戶可經過上傳的公鑰來驗證簽名,也就是說,你們能夠驗證這個構件是否由本人上傳的,由於有可能該構件被壞人給篡改了。

5. 查詢公鑰是否發佈成功

gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 82DC852E

實際上就是從 key server 上經過公鑰 ID 來接收公鑰,此外,也能夠到 sks-keyservers.net 上經過公鑰 ID 去查詢。

第五步:修改 Maven 配置文件

須要修改的 Maven 配置文件包括:setting.xml(全局級別)與 pom.xml(項目級別)。

1. setting.xml

<!-- lang: xml -->
<settings>

    ...

    <servers>
        <server>
            <id>oss</id>
            <username>用戶名</username>
            <password>密碼</password>
        </server>
    </servers>

    ...

</settings>

使用本身註冊的 Sonatype 帳號的用戶名與密碼來配置以上 server 信息。

2. pom.xml

<!-- lang: xml -->
<project>

    ...

    <name>smart</name>
    <description>Smart is a lightweight Java Web Framework and reusable components.</description>
    <url>http://www.smart4j.org/</url>

    <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>huangyong</name>
            <email>huangyong.java@gmail.com</email>
        </developer>
    </developers>

    <scm>
        <connection>scm:git:git@git.oschina.net:huangyong/smart.git</connection>
        <developerConnection>scm:git:git@git.oschina.net:huangyong/smart.git</developerConnection>
        <url>git@git.oschina.net:huangyong/smart.git</url>
    </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>oss</id>
                    <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
                </snapshotRepository>
                <repository>
                    <id>oss</id>
                    <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
                </repository>
            </distributionManagement>
        </profile>
    </profiles>

    ...

</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

當執行以上 Maven 命令時,會自動彈出一個對話框,須要輸入上面提到的 Passphase,它就是經過 GPG 密鑰對的密碼,只有本身才知道。隨後會看到大量的 upload 信息,並且速度比較慢,常常會 timeout,須要反覆嘗試。

注意:此時上傳的構件並未正式發佈到中央倉庫中,只是部署到 OSS 中了,下面纔是真正的發佈。

第七步:在 OSS 中發佈構件

在 OSS 中,使用本身的 Sonatype 帳號登陸後,可在 Staging Repositories 中查看剛纔已上傳的構件,這些構件目前是放在 Staging 倉庫中,可進行模糊查詢,快速定位到本身的構件。此時,該構件的狀態爲 Open,須要勾選它,而後點擊 Close 按鈕。接下來系統會自動驗證該構件是否知足指定要求,當驗證完畢後,狀態會變爲 Closed,最後,點擊 Release 按鈕來發布該構件。

第八步:通知 Sonatype「構件已成功發佈」

須要在曾經建立的 Issue 下面回覆一條「構件已成功發佈」的評論,這是爲了通知 Sonatype 的工做人員爲須要發佈的構件作審批,發佈後會關閉該 Issue。

第九步:等待構件審批經過

沒錯,仍是要等,也許又是 1 ~ 2 天。一樣,當審批經過後,將會收到郵件通知。

第十步:從中央倉庫中搜索構件

最後,就能夠到中央倉庫中搜索到本身發佈的構件了!

中央倉庫搜索網站:http://search.maven.org/

最後,想說一句:第一次都是很痛的,之後就舒服了。沒錯,只有第一次發佈才如此痛苦,之後 deploy 的構件會自動部發布到中央倉庫,無需再這樣折騰了。


至此,Smart 構件已成功發佈到中央倉庫,如今可在你的代碼中直接配置 Smart 依賴了。

例如:依賴 Smart Framework,你能夠這樣配置:

<!-- lang: xml -->
<dependency>
    <groupId>org.smart4j</groupId>
    <artifactId>smart-framework</artifactId>
    <version>2.2</version>
</dependency>

最後,感謝 Dead_knight悠悠然然 的經驗分享!

Smart 系列博文:http://my.oschina.net/huangyong/blog/158380

參考資料

Choosing your Coordinates

https://docs.sonatype.org/display/Repository/Choosing+your+Coordinates

Sonatype OSS Maven Repository Usage Guide

https://docs.sonatype.org/display/Repository/Sonatype+OSS+Maven+Repository+Usage+Guide

How To Generate PGP Signatures With Maven

https://docs.sonatype.org/display/Repository/How+To+Generate+PGP+Signatures+With+Maven#HowToGeneratePGPSignaturesWithMaven-MavenGPGPlugin

相關文章
相關標籤/搜索