1. 程式人生 > >向Maven中央倉庫提交JAR包

向Maven中央倉庫提交JAR包

本文將詳細介紹所有向Maven中央倉庫提交SDK(對於JAVA即是jar包)的流程。如果您已經完成了整個流程但遇到一些問題,可以直接跳到文末,那裡總結了很多遇到的問題以及解決的方案。

1. sonatype工單

為了向Maven中央倉庫提交SDK,我們首先要向sonatype系統提交工單

  • 如果沒有賬戶,首先註冊賬戶

  • 選擇Create Issue 建立釋出 按照要求填寫資訊

  • 其中需要注意的是,groupId就是我們jar包匯入時的groupld,一般我們使用域名

  • 點選確定後需要等待工作人員review,美國有時差,往往需要一天的確認時間

  • 工作人員確定後,Issue的狀態會變為綠色的RESOLVED

  • 開通時工作人員會在Issue下面的comments回覆資訊,資訊包含了我們釋出release、snapshots版本的地址。這個地址我們之後配置要用到,我們釋出自己的包到這兩個地址。

2.GPG

GPG是一種加密簽名命令列工具,maven官方要求在上傳時使用這個軟體做加密。在向Maven中央倉庫提交SDK的過程中,安裝並啟用GPG主要需要進行以下四個步驟。

2.1 安裝

# mac 環境
brew install gpg

# Debian / Ubuntu 環境
sudo apt-get install gnupg

# Fedora / CentOS環境
yum install gnupg

2.2 驗證是否安裝成功

# mac 環境 
# mac環境一切gpg開頭的命令,都需要使用gpg2代替
gpg2 --help

# 其他環境
gpg --help

2.3 生成金鑰

輸入下面的命令後,會進行一系列步驟,基本都選擇預設選項即可。還會被GPG要求填寫真實姓名,填寫電子郵箱。之後需要輸入一個私鑰密碼,這個私鑰密碼用來保護我們的私鑰不被濫用,輸入一個密碼並記住它。具體為什麼需要進行上述這些步驟,可見GPG簡介

gpg --gen-key

2.4 上傳公鑰

生成後要將公鑰上傳至伺服器。下述命令最後用自己的公鑰替換,公鑰是一串十六進位制的數字,例:DE346FA5。請不要使用上述舉例的公鑰,要使用上一步自己生成的公鑰。

gpg --keyserver http://http-keys.gnupg.net --send-keys 你的公鑰

3. /.m2/setting.xml

setting.xml檔案用來進行賬戶密碼的配置。

理論上,如果我們想讓整臺機器都能適用這個上傳功能,我們應該在conf/目錄下的setting.xml檔案進行配置。但一般情況下在.m2/目錄下配置就能滿足需要,還有就是有時我們沒有修改conf/目錄下檔案的許可權。

<servers>
    <server>
        <id>sonatype-nexus-snapshots</id>
        <username>註冊sonatype工單的使用者名稱</username>
        <password>註冊sonatype工單的密碼</password>
    </server>
    <server>
        <id>sonatype-nexus-staging</id>
        <username>註冊sonatype工單的使用者名稱</username>
        <password>註冊sonatype工單的密碼</password>
    </server>
</servers>
  • 上述配置在<servers>標籤內配置

  • <username>和<password>需要填寫第一步中自己註冊的sonatype使用者名稱和密碼

  • <id>要和下面配置的POM適配,理論上自己設定也可以。為了增加可靠性,建議使用上文的<id>

  • 有的人的配置只用了一個<server>,這也是可以的,因為這只是一個讀取使用者名稱和密碼的功能。這裡配置了兩個是為了在語義上更便於理解,snapshots結尾的是快照版本,staging結尾的是釋出版本

4. POM.xml

這裡的POM檔案指的是我們要釋出的Jar專案的目錄中的根POM檔案。POM檔案中除了自己需要配置的依賴和外掛以外,必須要進行下面這些內容的配置。

4.1 parent

首先在POM檔案開始處,整個<project>標籤下配置<parent>,以下的內容都是固定的不需要修改。

<parent>的作用是為我們匯入很多依賴的包,而我們不需要再額外進行宣告。配置<parent>減少了我們對整個POM的改動,但如果其中有和我們自己配置衝突的jar,也可以不使用<parent>,但一定要進入oss-parent這個構件,把所有其他需要的依賴和外掛都手動配置到POM中。

<parent>
    <groupId>org.sonatype.oss</groupId>
    <artifactId>oss-parent</artifactId>
    <version>7</version>
</parent>

4.2 distributionManagement

<distributionManagement>中配置了我們上傳到中央倉庫時的地址和賬號密碼。這個標籤可以配置在<project>下,如果你有<profile>也可以配置在其中。其中的內容有可能需要修改。

其中<snapshotRepository>內表示快照版本釋出的資訊,<repository>內是釋出版本的資訊。<id>對應於setting.xml檔案中的<server>中的<id>,如果你上面的setting是按照本文的方式配置那麼就不需要修改。<url>是第一步我們在建立工單時,管理員在審批同意後在下面回覆的地址。一般的情況下,理論上我們的地址應該都是一樣的。回覆的形式如下。

按照回覆中提供的地址填入url即可,有的人會在<snapshotRepository>和<repository>內配置一個叫做<name>的標籤,這個標籤不是必須的。

<distributionManagement>
    <snapshotRepository>
        <id>sonatype-nexus-snapshots</id>
        <url>https://oss.sonatype.org/content/repositories/snapshots</url>
    </snapshotRepository>
    <repository>
        <id>sonatype-nexus-staging</id>
        <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
    </repository>
</distributionManagement>

4.3 licenses developers scm

上述三個標籤都是Maven要求我們必須提供的,但實際上對於SDK上傳成功的幫助並不大。配置的位置在<project>標籤內。內容是自己配置的,希望不要直接複製下面的程式碼。

  • licenses

    • name - 隨便設定一個name

    • url - 一個在第一步提交工單時填入的專案url

  • developer

    • id - 隨便設定一個id

    • name - 開發者姓名,隨意填寫

    • email - 自己的郵箱

  • scm

    • scm中的三個標籤可以都不填

<licenses>
    <license>
        <name>The Apache License, Version 2.0</name>
        <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
    </license>
</licenses>

<developers>
    <developer>
        <id>gwon sdk</id>
        <name>GWON SDK</name>
        <email>[email protected]</email>
    </developer>
</developers>

<scm>
    <connection></connection>
    <developerConnection></developerConnection>
    <url></url>
</scm>

4.4 name url description

上述三個標籤都是Maven要求我們必須提供的,但實際上對於SDK上傳成功的幫助並不大。配置的位置在<project>標籤內。內容是自己配置的,希望不要直接複製下面的程式碼。

這三個標籤的內容均可隨意填寫。

<name>GWON SDK</name>
<url>https://www.gwon.com/</url>
<description>this is my sdk, ths.</description>

4.5 maven執行外掛

我們需要配置一些maven執行中要使用到的外掛,下面的內容配置在<project> -> <build> -> <plugins> 中,是不需要修改的,複製即可。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>2.3.2</version>
    <configuration>
        <source>1.6</source>
        <target>1.6</target>
        <encoding>UTF-8</encoding>
    </configuration>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.3.2</version>
    <configuration></configuration>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>2.10.4</version>
    <configuration>
        <encoding>${chartset.UTF8}</encoding>
        <aggregate>true</aggregate>
        <charset>${chartset.UTF8}</charset>
        <docencoding>${chartset.UTF8}</docencoding>
    </configuration>
    <executions>
        <execution>
            <id>attach-javadocs</id>
            <phase>package</phase>
            <goals>
                <goal>jar</goal>
            </goals>
            <configuration>
                <additionalparam>-Xdoclint:none</additionalparam>
            </configuration>
        </execution>
    </executions>
</plugin>

4.6 nexus-staging-maven-plugin

一般情況下我們提交了SDK到中央倉庫後,需要提交到sonatype進行審批再發布,這個外掛可以幫我們自動提交,讓整個過程自動化,雖然這個外掛不是必須的,但是強烈推薦使用的外掛。內容配置在<project> -> <build> -> <plugins> 中,其中有一處需要修改,<configuration> -> <serverId> 需要按照我們在setting檔案中配置的<id>設定,如果你上面的setting是按照本文的方式配置那麼就不需要修改。

<plugin>
    <groupId>org.sonatype.plugins</groupId>
    <artifactId>nexus-staging-maven-plugin</artifactId>
    <version>1.6.3</version>
    <extensions>true</extensions>
    <configuration>
        <serverId>sonatype-nexus-staging</serverId>
        <nexusUrl>https://oss.sonatype.org/</nexusUrl>
        <autoReleaseAfterClose>true</autoReleaseAfterClose>
    </configuration>
</plugin>

4.7 maven-gpg-plugin

這個外掛幫助我們自動進行gpg的簽名,雖然這個外掛不是必須的,但是強烈推薦使用的外掛。內容配置在<project> -> <build> -> <plugins> 中,是不需要修改的,複製即可。

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

5. 部署

部署只需要使用mvn命令即可。下面的命令中最後需要使用你的私鑰密碼,clean是可選項,用來清理之前生成的構件,-P sonatype-oss-release 是必選項,這個<profile>在<parent>中,如果你使用了它那麼這是必須要填寫的。

mvn clean deploy -P sonatype-oss-release -Darguments="gpg.passphrase=你的私鑰密碼"

6. 檢視釋出構件

  • 進入sonatype並登入

  • 點選左側的Advanced Search搜尋你的artifactId名稱即可

7. 問題解決方案

在整個配置的過程中可能存在很多問題,下面對常見的問題提供一些解決的方案。

7.1 部署失敗、某個包找不到、下載到lastUpdate結尾的jar檔案

造成這些的原因可能不是你的專案存在問題,而是mvn命令在執行的時候到中央倉庫下載相關包的速度太慢,導致時間超限直接報錯。解決方法是用國內的Maven倉庫映象代理,下面提供一個比較快的阿里雲映象,我們將其配置在.m2/setting.xml中<mirrors>內即可,不需要下面修改任何一處。

<mirrors>
    <mirror>
        <id>alimaven</id>
        <mirrorOf>central</mirrorOf>
        <name>aliyun maven</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    </mirror>
</mirrors>

7.2 GPG報錯、GPG找不到

有很多人安裝了GPG之後沒把自己的公鑰上傳,這會導致Maven中央倉庫找不到你的公鑰無法匹配。解決方法是執行命令列上傳公鑰。

gpg --keyserver http://http-keys.gnupg.net --send-keys 你的公鑰

7.3 在部署的過程中跳出提示框要求輸入GPG密碼

理論上這不是問題,但是有的情況下我們需要自動化整個釋出流程不能存在這種互動的形式。解決方法是在POM檔案中匯入相關包跳過這個步驟。

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

7.4 mac電腦無法執行gpg命令

mac中的gpg是比較特殊的,我們在命令列中要用gpg2來代替gpg。下面是mac電腦的安裝方式。

brew install gpg
gpg2 --help
gpg2 --gen-key
gpg2 --keyserver http://http-keys.gnupg.net --send-keys 你的公鑰

7.5 mac電腦部署過程中gpg報錯

導致mac在部署中也會出現gpg錯誤的一個原因和7.4是一樣的,為了解決這個問題,我們需要在setting中額外配置資訊。下面的配置要將自己的私鑰密碼填寫進去,除此之外不需要任何修改。

<profiles>
    <profile>
      <id>ossrh</id>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
      <properties>
        <gpg.executable>gpg2</gpg.executable>
        <gpg.passphrase>你的私鑰密碼</gpg.passphrase>
      </properties>
    </profile>
</profiles>

7.6 我在sonatype上提交了工單但一直不能審批通過

理論上,只要我們在groupId中填寫的是自己的域名,整個審批流程是沒有被拒絕的理由的。如果一直不能審批通過可能是因為他們的公司在美國和中國有時差,他們的辦公時間是我們的晚上,所以請耐心等待。