Maven 教程之釋出 jar 到私服或中央倉庫

靜默虛空發表於2019-04-16

:notebook: 本文已歸檔到:「blog

釋出 jar 包到中央倉庫

為了避免重複造輪子,相信每個 Java 程式設計師都想打造自己的腳手架或工具包(自己定製的往往才是最適合自己的)。那麼如何將自己的腳手架釋出到中央倉庫呢?下面我們將一步步來實現。

在 Sonatype 建立 Issue

(1)註冊 Sonatype 賬號

釋出 Java 包到 Maven 中央倉庫,首先需要在 Sonatype 網站建立一個工單(Issues)。

第一次使用這個網站的時候需要註冊自己的帳號(這個帳號和密碼需要記住,後面會用到)。

(2)建立 Issue

註冊賬號成功後,根據你 Java 包的功能分別寫上SummaryDescriptionGroup IdSCM url以及Project URL等必要資訊,可以參見我之前建立的 Issue:OSSRH-36187

Maven 教程之釋出 jar 到私服或中央倉庫

建立完之後需要等待 Sonatype 的工作人員稽核處理,稽核時間還是很快的,我的稽核差不多等待了兩小時。當 Issue 的 Status 變為RESOLVED後,就可以進行下一步操作了。

說明:如果你的 Group Id 填寫的是自己的網站(我的就是這種情況),Sonatype 的工作人員會詢問你那個 Group Id 是不是你的域名,你只需要在上面回答是就行,然後就會通過稽核。

使用 GPG 生成公私鑰對

(1)安裝 Gpg4win

Windows 系統,可以下載 Gpg4win 軟體來生成金鑰對。

Gpg4win 下載地址

安裝後,執行命令 gpg --version 檢查是否安裝成功。

C:\Program Files (x86)\GnuPG\bin>gpg --version
gpg (GnuPG) 2.2.10
libgcrypt 1.8.3
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the exdunwu permitted by law.

Home: C:/Users/Administrator/AppData/Roaming/gnupg
Supported algorithms:
Pubkey: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
        CAMELLIA128, CAMELLIA192, CAMELLIA256
Hash: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compression: Uncompressed, ZIP, ZLIB, BZIP2
複製程式碼

(2)生成金鑰對

執行命令 gpg --gen-key

C:\Program Files (x86)\GnuPG\bin>gpg --gen-key
gpg (GnuPG) 2.2.10; Copyright (C) 2018 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the exdunwu permitted by law.

Note: Use "gpg --full-generate-key" for a full featured key generation dialog.

GnuPG needs to construct a user ID to identify your key.

Real name: Zhang Peng
Email address: forbreak@163.com
You selected this USER-ID:
    "Zhang Peng <forbreak@163.com>"

Change (N)ame, (E)mail, or (O)kay/(Q)uit? O
複製程式碼

說明:按照提示,依次輸入使用者名稱、郵箱。

(3)檢視公鑰

C:\Program Files (x86)\GnuPG\bin>gpg --list-keys

gpg: checking the trustdb
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: depth: 0  valid:   2  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 2u
gpg: next trustdb check due at 2020-11-05
C:/Users/Administrator/AppData/Roaming/gnupg/pubring.kbx
--------------------------------------------------------
pub   rsa2048 2018-11-06 [SC] [expires: 2020-11-06]
      E4CE537A3803D49C35332221A306519BAFF57F60
uid           [ultimate] forbreak <forbreak@163.com>
sub   rsa2048 2018-11-06 [E] [expires: 2020-11-06]
複製程式碼

說明:其中,E4CE537A3803D49C35332221A306519BAFF57F60 就是公鑰

(4)將公鑰釋出到 PGP 金鑰伺服器

執行 gpg --keyserver hkp://pool.sks-keyservers.net --send-keys 釋出公鑰:

C:\Program Files (x86)\GnuPG\bin>gpg --keyserver hkp://pool.sks-keyservers.net --send-keys E4CE537A3803D49C35332221A306519BAFF57F60
gpg: sending key A306519BAFF57F60 to hkp://pool.sks-keyservers.net
複製程式碼

注意:有可能出現 gpg: keyserver receive failed: No dat 錯誤,等大約 30 分鐘後再執行就不會報錯了。

(5)檢視公鑰是否釋出成功

執行 gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 檢視公鑰是否釋出成功。

C:\Program Files (x86)\GnuPG\bin>gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys E4CE537A3803D49C35332221A306519BAFF57F60
gpg: key A306519BAFF57F60: "forbreak <forbreak@163.com>" not changed
gpg: Total number processed: 1
gpg:              unchanged: 1
複製程式碼

Maven 配置

完成了前兩個章節的準備工作,就可以將 jar 包上傳到中央倉庫了。當然了,我們還要對 maven 做一些配置。

settings.xml 配置

一份完整的 settings.xml 配置示例如下:

<?xml version="1.0" encoding="UTF-8"?>

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">

  <pluginGroups>
    <pluginGroup>org.sonatype.plugins</pluginGroup>
  </pluginGroups>

  <!-- 使用者名稱、密碼就是 Sonatype 賬號、密碼 -->
  <servers>
    <server>
      <id>sonatype-snapshots</id>
      <username>xxxxxx</username>
      <password>xxxxxx</password>
    </server>
    <server>
      <id>sonatype-staging</id>
      <username>xxxxxx</username>
      <password>xxxxxx</password>
    </server>
  </servers>

  <!-- 使用 aliyun maven 倉庫加速下載 -->
  <mirrors>
    <mirror>
      <id>nexus-aliyun</id>
      <mirrorOf>*</mirrorOf>
      <name>Aliyun</name>
      <url>http://maven.aliyun.com/nexus/condunwu/groups/public</url>
    </mirror>
  </mirrors>

  <!-- gpg 的密碼,注意,這裡不是指公鑰 -->
  <profiles>
    <profile>
      <id>sonatype</id>
      <properties>
        <gpg.executable>C:/Program Files (x86)/GnuPG/bin/gpg.exe</gpg.executable>
        <gpg.passphrase>xxxxxx</gpg.passphrase>
      </properties>
    </profile>
  </profiles>

  <activeProfiles>
    <activeProfile>sonatype</activeProfile>
  </activeProfiles>
</settings>
複製程式碼

pom.xml 配置

(1)新增 licenses、scm、developers 配置:

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

<developers>
  <developer>
    <name>xxxxxx</name>
    <email>forbreak@163.com</email>
    <url>https://github.com/dunwu</url>
  </developer>
</developers>

<scm>
  <url>https://github.com/dunwu/dunwu</url>
  <connection>git@github.com:dunwu/dunwu.git</connection>
  <developerConnection>https://github.com/dunwu</developerConnection>
</scm>
複製程式碼

(2)新增 distributionManagement 配置

<distributionManagement>
  <snapshotRepository>
    <id>sonatype-snapshots</id>
    <url>https://oss.sonatype.org/content/repositories/snapshots</url>
  </snapshotRepository>
  <repository>
    <id>sonatype-staging</id>
    <url>https://oss.sonatype.org/service/local/staging/deploy/maven2</url>
  </repository>
</distributionManagement>
複製程式碼

說明:<snapshotRepository> 指定的是 snapshot 倉庫地址;<repository> 指定的是 staging (正式版)倉庫地址。需要留意的是,這裡的 id 需要和 settings.xml 中的 <server> 的 id 保持一致。

(3)新增 profiles 配置

 <profiles>
  <profile>
    <id>sonatype</id>
    <build>
      <plugins>
        <plugin>
          <groupId>org.sonatype.plugins</groupId>
          <artifactId>nexus-staging-maven-plugin</artifactId>
          <version>1.6.7</version>
          <extensions>true</extensions>
          <configuration>
            <serverId>sonatype-snapshots</serverId>
            <nexusUrl>https://oss.sonatype.org/</nexusUrl>
            <autoReleaseAfterClose>true</autoReleaseAfterClose>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-javadoc-plugin</artifactId>
          <version>3.0.1</version>
          <configuration>
            <failOnError>false</failOnError>
            <quiet>true</quiet>
          </configuration>
          <executions>
            <execution>
              <id>attach-javadocs</id>
              <goals>
                <goal>jar</goal>
              </goals>
            </execution>
          </executions>
        </plugin>

        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-gpg-plugin</artifactId>
          <version>1.6</version>
          <executions>
            <execution>
              <id>sign-artifacts</id>
              <phase>verify</phase>
              <goals>
                <goal>sign</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </build>
  </profile>
</profiles>
複製程式碼

部署和釋出

按照上面的步驟配置完後,一切都已經 OK。

此時,使用 mvn clean deploy -P sonatype 命令就可以釋出 jar 包到中央倉庫了:

說明:-P 引數後面的 sonatype 需要和 pom.xml 中 <profile> 的 id 保持一致,才能啟用 profile。

部署 maven 私服

工作中,Java 程式設計師開發的商用 Java 專案,一般不想釋出到中央倉庫,使得人人盡知。這時,我們就需要搭建私服,將 maven 伺服器部署在公司內部網路,從而避免 jar 包流傳出去。怎麼做呢,讓我們來一步步學習吧。

下載安裝 Nexus

進入官方下載地址,選擇合適版本下載。

Maven 教程之釋出 jar 到私服或中央倉庫

本人希望將 Nexus 部署在 Linux 機器,所以選用的是 Unix 版本。

這裡,如果想通過命令方式直接下載(比如用指令碼安裝),可以在官方歷史釋出版本頁面中找到合適版本,然後執行以下命令:

wget -O /opt/maven/nexus-unix.tar.gz http://download.sonatype.com/nexus/3/nexus-3.13.0-01-unix.tar.gz
tar -zxf nexus-unix.tar.gz
複製程式碼

解壓後,有兩個目錄:

  • nexus-3.13.0-01 - 包含了 Nexus 執行所需要的檔案。是 Nexus 執行必須的。
  • sonatype-work - 包含了 Nexus 生成的配置檔案、日誌檔案、倉庫檔案等。當我們需要備份 Nexus 的時候預設備份此目錄即可。

啟動停止 Nexus

進入 nexus-3.13.0-01/bin 目錄,有一個可執行指令碼 nexus。

執行 ./nexus,可以檢視允許執行的引數,如下所示,含義可謂一目瞭然:

$ ./nexus
Usage: ./nexus {start|stop|run|run-redirect|status|restart|force-reload}
複製程式碼
  • 啟動 nexus - ./nexus start
  • 停止 nexus -

啟動成功後,在瀏覽器中訪問 http://<ip>:8081,歡迎頁面如下圖所示:

Maven 教程之釋出 jar 到私服或中央倉庫

點選右上角 Sign in 登入,預設使用者名稱/密碼為:admin/admin123。

有必要提一下的是,在 Nexus 的 Repositories 管理頁面,展示了可用的 maven 倉庫,如下圖所示:

Maven 教程之釋出 jar 到私服或中央倉庫

說明:

  • maven-central - maven 中央庫(如果沒有配置 mirror,預設就從這裡下載 jar 包),從 repo1.maven.org/maven2/ 獲取資源
  • maven-releases - 儲存私有倉庫的發行版 jar 包
  • maven-snapshots - 儲存私有倉庫的快照版(除錯版本) jar 包
  • maven-public - 私有倉庫的公共空間,把上面三個倉庫組合在一起對外提供服務,在本地 maven 基礎配置 settings.xml 中使用。

使用 Nexus

如果要使用 Nexus,還必須在 settings.xml 和 pom.xml 中配置認證資訊。

配置 settings.xml

一份完整的 settings.xml

<?xml version="1.0" encoding="UTF-8"?>

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  <pluginGroups>
    <pluginGroup>org.sonatype.plugins</pluginGroup>
  </pluginGroups>

  <!-- Maven 私服賬號資訊 -->
  <servers>
    <server>
      <id>releases</id>
      <username>admin</username>
      <password>admin123</password>
    </server>
    <server>
      <id>snapshots</id>
      <username>admin</username>
      <password>admin123</password>
    </server>
  </servers>

  <!-- jar 包下載地址 -->
  <mirrors>
    <mirror>
      <id>public</id>
      <mirrorOf>*</mirrorOf>
      <url>http://10.255.255.224:8081/repository/maven-public/</url>
    </mirror>
  </mirrors>

  <profiles>
    <profile>
      <id>zp</id>
      <repositories>
        <repository>
          <id>central</id>
          <url>http://central</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>true</enabled>
          </snapshots>
        </repository>
      </repositories>
      <pluginRepositories>
        <pluginRepository>
          <id>central</id>
          <url>http://central</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>true</enabled>
            <updatePolicy>always</updatePolicy>
          </snapshots>
        </pluginRepository>
      </pluginRepositories>
    </profile>
  </profiles>

  <activeProfiles>
    <activeProfile>zp</activeProfile>
  </activeProfiles>
</settings>
複製程式碼

配置 pom.xml

在 pom.xml 中新增如下配置:

  <distributionManagement>
    <repository>
      <id>releases</id>
      <name>Releases</name>
      <url>http://10.255.255.224:8081/repository/maven-releases</url>
    </repository>
    <snapshotRepository>
      <id>snapshots</id>
      <name>Snapshot</name>
      <url>http://10.255.255.224:8081/repository/maven-snapshots</url>
    </snapshotRepository>
  </distributionManagement>
複製程式碼

注意:

  • <repository><snapshotRepository> 的 id 必須和 settings.xml 配置檔案中的 <server> 標籤中的 id 匹配。
  • <url> 標籤的地址需要和 maven 私服的地址匹配。

執行 maven 構建

如果要使用 settings.xml 中的私服配置,必須通過指定 -P zp 來啟用 profile。

示例:

## 編譯並打包 maven 專案
$ mvn clean package -Dmaven.skip.test=true -P zp

## 編譯並上傳 maven 交付件(jar 包)
$ mvn clean deploy -Dmaven.skip.test=true -P zp
複製程式碼

參考資料

相關文章