最近我作了一個開源項目 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-client - disconf-core - disconf-web - disconf-demos
我將會把 disconf-core和disconf-client 推送到Maven的Central Repository上,由於這兩個包是編程用戶須要的。disconf-web 的編譯結果是一個war包,所以不會推送到Maven的Central Repository上。github
下面將仔細的介紹 disconf-core 包的推送過程。web
用ssh-key生成的id_rsa.pub的內容放到 https://github.com/settings/ssh 中。apache
它至少應該包括如下標籤:編程
具體可參見: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-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>
咱們在本地生成好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提出申請了。首先,要到這裏申請他們的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/
用上一步註冊時的用戶名和密碼填充這裏:
nexus-release 用戶名 密碼
這裏的id要和pom.xml文件裏面的repository id對應,用戶名和密碼則是Sonatype的Jira賬號和密碼。
進到 disconf 根目錄下,執行 mvn clean install
而後
cd disconf-core mvn clean install
若是沒有問題,說明能夠準備上傳了。
若是你的項目是 SNAPSHOT的,那麼 就可使用本步方法進行上傳,它會上傳到 https://oss.sonatype.org/content/repositories/snapshots
首先,爲了後續的操做順利執行,咱們要確保項目的整個目錄沒有本地未提交的修改,最好先pull一遍確保後續的步驟裏沒有衝突。而後運行:
mvn release:prepare
mvn release:prepare does the following:
若是命令順利運行結束,那麼這個步驟就算完成了。若是中間出現了什麼問題,能夠在修復問題後再次運行這條命令,若是想要得到更詳細的信息,能夠運行:
mvn release:prepare -X
若是不但願從終止的地方開始,而是想從頭再來的話能夠輸入:
mvn release:prepare -Dresume=false
若是想回滾,則
mvn release:rollback
若是這步成功了,則上傳到 https://oss.sonatype.org/content/repositories/snapshots 這裏了。
SNAPSHOT通常表明着有Bug版本,線上代碼通常不會使用,所以,非SNAPSHOT版本的包纔是咱們真正須要的。
不要執行"第七步之一」,執行:
mvn clean deploy -P release -Dgpg.passphrase=第三步中的密碼
mvn release:perform does the following
注: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按鈕發佈你的構件。
而後回到JIRA中你的Issue,寫個comment,我寫的是Component has been successfully issued.告訴工做人員我發佈完成了,等待他們審覈。審覈經過後咱們就能夠在中央庫搜索到咱們的構件了!搜索的地址 是:http://search.maven.org/
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包,而後再在界面上傳。實踐證實這種方法不可取。由於簽名驗證通不過。