Github開源Java項目(Disconf)上傳到Maven Central Repository方法詳細介紹

最近我作了一個開源項目 Disconf:Distributed Configuration Management Platform(分佈式配置管理平臺) ,簡單來講,就是爲全部業務平臺系統管理配置文件的平臺系統。更詳細的介紹,請看項目主頁。java

項目是用Java寫的,Maven管理的,那麼,天然而然,整個項目應該以Maven倉庫POM方式暴露給用戶來使用。所以,這兩天我一直在折騰Maven Central Repository。react

本文使用Sonatype Nexus做爲代理倉庫。也就是說先要把軟件發佈到這裏,而後他們會幫同步到Maven的Central Repository上,這貌似是目前最簡單有效的辦法。 Sonatype使用Nexus爲開源項目提供託管服務。你能夠經過它發佈快照(snapshot)或是穩定版(release)到Maven中央倉庫。 咱們只要註冊一個Sonatype的JIRA帳號、建立一個JIRA ticket,而後對POM文件稍做配置便可。git

Disconf的項目結構介紹

disconf
    - disconf-client
    - disconf-core
    - disconf-web
    - disconf-demos

我將會把 disconf-core和disconf-client 推送到Maven的Central Repository上,由於這兩個包是編程用戶須要的。disconf-web 的編譯結果是一個war包,所以不會推送到Maven的Central Repository上。github

下面將仔細的介紹 disconf-core 包的推送過程。web

第零步:將你的電腦與Github打通

用ssh-key生成的id_rsa.pub的內容放到 https://github.com/settings/ssh 中。apache

第一步:修改 disconf-core 的 POM文件

它至少應該包括如下標籤:編程

具體可參見:https://github.com/knightliao/disconf/blob/master/disconf-core/pom.xml服務器

<modelVersion>4.0.0</modelVersion>

<artifactId>disconf-core</artifactId>
<packaging>jar</packaging>

<version>2.3-SNAPSHOT</version>
<name>disconf-core</name>

<parent>
    <groupId>com.baidu.disconf</groupId>
    <artifactId>disconf-base</artifactId>
    <version>2.1</version>
    <relativePath>../</relativePath>
</parent>

<url>https://github.com/knightliao/disconf/tree/master/disconf-core</url>
<description>https://github.com/knightliao/disconf/tree/master/disconf-core</description>

<organization>
    <name>Baidu</name>
    <url>http://www.baidu.com</url>
</organization>

<scm>
    <url>scm:git:git@github.com:knightliao/disconf</url>
    <connection>scm:git:git@github.com:knightliao/disconf</connection>
    <tag>disconf-core</tag>
</scm>

下面爲它設置一個profile, 命名爲release,意思就是發佈到中央庫。這裏設置了兩個庫,一個snapshots,一個是正式的發佈庫。ssh

另外,中央庫須要source和doc,因此增長兩個plugin.maven

<profiles>
    <profile>
        <id>release</id>
        <distributionManagement>
            <snapshotRepository>
                <id>nexus-release</id>
                <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
            </snapshotRepository>
            <repository>
                <id>nexus-release</id>
                <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
            </repository>
        </distributionManagement>
        <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>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-gpg-plugin</artifactId>
                    <version>1.5</version>
                    <executions>
                        <execution>
                            <id>sign-artifacts</id>
                            <phase>verify</phase>
                            <goals>
                                <goal>sign</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

第二步:修改 disconf 的 POM文件

disconf的Pom是disconf-core的parent pom。

具體可參見:https://github.com/knightliao/disconf/blob/master/pom.xml

它至少應該包括如下標籤:

<developers>
    <developer>
        <name>Liao Qiqi</name>
        <id>knightliao</id>
        <email>liaoqiqi (AT) baidu.com</email>
        <roles>
            <role>Developer</role>
        </roles>
        <timezone>+8</timezone>
    </developer>
    <developer>
        <name>Wu Ning</name>
        <id>wuning</id>
        <email>wuning01 (AT) baidu.com</email>
        <roles>
            <role>Developer</role>
        </roles>
        <timezone>+8</timezone>
    </developer>
</developers>

第三步:準備好GPG工具

咱們在本地生成好jar包後,要上傳到中央庫,爲了保證上傳過程的數據校驗是對的,Sonatype要求咱們使用GPG來進行數據校驗。

gpg --gen-key

出現以下提示後輸入1:

在以下提示後輸入想要的KEY的位數,沒有特別須要的話直接回車也能夠:

接着會出現詢問KEY的有效期,默認這是0,也就是說永遠不過時:

接着輸入y並回車確認永久有效。而後會出現下面的提示,要求輸入你的真實姓名:

根據提示輸入姓名,郵箱和備註後,而後會提示輸入用來保護密鑰的密碼(passphrase),若是不須要密碼的話直接回車,若是輸入了密碼那麼必定要記住,這個密碼在後面會用到。接下來系統會要求你輸入一些隨機字符,在鍵盤的字母和符號上亂按就能夠了,不過別按回車。

注意,這裏的姓名和郵箱、密碼 三個東西都要記住。!!

生成成功之後會出現信息:

public and secret key created and signed

要查看現有的公鑰,輸入:

gpg --list-keys

輸出的格式是這個樣子的:

knightliao@conan:~$ gpg --list-keys           
gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
/home/knightliao/.gnupg/pubring.gpg
-----------------------------------
pub   2048R/XX 2014-07-08
uid                  用戶名 <郵箱>
sub   2048R/YY 2014-07-08

這裏順便說一下,若是你有多個KEY,想刪除其中的某個KEY,方法是:

gpg --delete-keys XX

生成了key之後,按照Sonatype的要求,咱們須要把公鑰上傳到服務器上。輸入:

gpg --keyserver <a href="http://hkp://pool.sks-keyservers.net">hkp://pool.sks-keyservers.net</a> --send-keys XX

這個服務器地址是Sonatype規定的,所以不須要修改。

驗證一下:

gpg --keyserver <a href="http://hkp://pool.sks-keyservers.net">hkp://pool.sks-keyservers.net</a> --recv-keys C67A5D26

若是打印如下,則說明上傳成功:

gpg: requesting key C67A5D26 from hkp server <a href="http://pool.sks-keyservers.net">pool.sks-keyservers.net</a>
gpg: key C67A5D26: "用戶名 <郵箱>" not changed
gpg: Total number processed: 1
gpg:              unchanged: 1

第四步:註冊Sonatype

就要像Sonatype提出申請了。首先,要到這裏申請他們的Jira賬號。得到賬號之後,到這裏提 交一個申請ticket。點擊Create issue, Project要選Support - Open Source Project Repository Hosting,Issue Type選New Project。 再次提醒:groupId的寫法很是重要,要麼使用本身擁有的域名。要麼使用項目託管的子域名,例如com.github.username。爲了節省時 間,若是使用的是本身擁有的域名,那麼能夠在description裏寫清楚,不然客服有可能會問,這樣就一個來回就須要一個工做日了。

一個例子就是:https://issues.sonatype.org/browse/OSSRH-10550

注意,註冊時用戶名和郵箱必須是 第三步裏的 用戶名和郵箱。

註冊成功後,他們就會給你發送郵件,而後就可 登陸這裏 進行查看: https://oss.sonatype.org/

第五步:修改本地maven的 settings.xml

用上一步註冊時的用戶名和密碼填充這裏:

nexus-release 用戶名 密碼

這裏的id要和pom.xml文件裏面的repository id對應,用戶名和密碼則是Sonatype的Jira賬號和密碼。

第六步:編譯本地代碼

進到 disconf 根目錄下,執行 mvn clean install

而後

cd disconf-core
mvn clean install

若是沒有問題,說明能夠準備上傳了。

第七步之一:上傳SNAPSHOT版本代碼

若是你的項目是 SNAPSHOT的,那麼 就可使用本步方法進行上傳,它會上傳到 https://oss.sonatype.org/content/repositories/snapshots

首先,爲了後續的操做順利執行,咱們要確保項目的整個目錄沒有本地未提交的修改,最好先pull一遍確保後續的步驟裏沒有衝突。而後運行:

mvn release:prepare

mvn release:prepare does the following:

  1. Checks that your local source code does not have any modifications
  2. Writes a release.properties file with details of what it is doing
  3. Modifies the pom.xml to the release versions
  4. Does a build as far as "package" in order to assure itself that it's changes have not broken the build
  5. Commits the modified pom.xml files to SCM
  6. Tags the trunk
  7. Modifies the pom.xml to the next snapshot version
  8. Commits the modified pom.xml files to SCM

若是命令順利運行結束,那麼這個步驟就算完成了。若是中間出現了什麼問題,能夠在修復問題後再次運行這條命令,若是想要得到更詳細的信息,能夠運行:

mvn release:prepare -X

若是不但願從終止的地方開始,而是想從頭再來的話能夠輸入:

mvn release:prepare -Dresume=false

若是想回滾,則

mvn release:rollback

若是這步成功了,則上傳到 https://oss.sonatype.org/content/repositories/snapshots 這裏了。

第七步之二:上傳非SNAPSHOT版本代碼

SNAPSHOT通常表明着有Bug版本,線上代碼通常不會使用,所以,非SNAPSHOT版本的包纔是咱們真正須要的。

不要執行"第七步之一」,執行:

mvn clean deploy -P release -Dgpg.passphrase=第三步中的密碼

mvn release:perform does the following

  1. Checks out the tagged release into target/checkout
  2. Forks a "mvn deploy site-deploy"
  3. Removes the release.properties file

注:mvn clean deploy -P release -Dgpg.passphrase=第三步中的密碼 這句話執行時,若是你的版本是快照的,則上傳快照,若是是非快照的則上傳非快照的,Maven會根據模塊的版本號(pom文件中的version)中是否 帶有-SNAPSHOT來判斷是快照版本仍是正式版本。

發佈構建

進入https://oss.sonatype.org並登錄,會在左側有個staging Repositories點擊進入,在右側面板找到你的構件,狀態應該是open,你要將其置爲closed,點擊上方的close按鈕便可

接下來系統會自動驗證有效性,若是你的Group Id和pom.xml沒有錯誤,狀態會自動變成closed,若是有問題,會在下面提示你那裏有問題,加入有問題你能夠點擊drop按鈕刪掉這個構件,修改後從新執行步驟7。

接下來你須要點擊release按鈕發佈你的構件。

在Issue中通知工做人員

而後回到JIRA中你的Issue,寫個comment,我寫的是Component has been successfully issued.告訴工做人員我發佈完成了,等待他們審覈。審覈經過後咱們就能夠在中央庫搜索到咱們的構件了!搜索的地址 是:http://search.maven.org/

上傳的最佳實踐

  1. 先讓你的電腦與Github創建鏈接
  2. git clone 代碼下下載下來
  3. 對本地代碼執行 mvn clean install , 解決代碼自己的編譯問題
  4. 準備好GPG工具
  5. 申請註冊Sonatype
  6. 對於SNAPSHOT版本,則執行 mvn release:prepare , 一旦發現有錯誤,須要執行 mvn release:rollback,項目作完後,執行 mvn release:clean
  7. 對於release版本,則執行 mvn clean deploy -P release -Dgpg.passphrase=第三步中的密碼 。

遇到的一些問題

Return code is: 401, ReasonPhrase: Unauthorized. release:perform

這個是由於你在Maven的settings.xml裏的配置與disconf-core的pom.xml配置對應不上來。極可能就是 id沒有匹配。

Maven error: 「You don't have a SNAPSHOT project in the reactor projects list.」

若是的項目的版本不是SNAPSHOT,而你卻要用「第七步之一」進行上傳,則會報此錯誤。

i am getting permgen size error in jenkins how to increase

在Sonatype的界面進行上傳

我試過在本地編譯成jar包,而後再在界面上傳。實踐證實這種方法不可取。由於簽名驗證通不過。

相關文章
相關標籤/搜索