記一次完整的Maven中央倉庫發佈過程

996.icu
網上文章很多,不過仍是踩了一些坑,這裏記錄一下:html

工具和資料

建立新項目

  1. Maven中央倉庫是由Sonatype維護的,所以須要到他們的JIRA系統,用相似報Bug的方式建立新項目
  2. 首先訪問Sonatype的JIRA系統,註冊一個帳號,地址爲 https://issues.sonatype.org/s...
  3. 記好本身在Sonatype上的帳號密碼,後面須要添加到maven的settings.xml中
  4. 點"Create"按鈕,建立一個新的Issue,默認的Issue Type就是New Project,不要改變,依次填好下面的星標部分
  5. 這時候Github上的項目地址、SCM地址(也就是git地址)應該已經肯定了;GroupId建議直接用"com.github.用戶名",不然須要驗證你對域名的全部權
  6. 建立的Issue是須要審覈的,當其狀態變爲Resolved狀態,就能夠進行項目上傳了

建立GPG密鑰並上傳

  1. Maven中央倉庫要求使用GPG密鑰對上傳的Jar包進行數字簽名,所以這一步不可缺乏
  2. 個人電腦安裝了Windows版Git,裏面自帶gpg.exe,可是須要先把gpg.exe所在目錄加入到PATH環境變量中,好比個人電腦中是D:devGitusrbin,注意和git.exe不在同一個目錄。也能夠參考其餘人的流程使用界面工具建立。
  3. 打開命令行窗口,執行gpg --gen-key,按照提示輸入信息,具體見下面的參考「GPG密鑰的生成與使用」
  4. 記好私鑰的密鑰,後面會把它添加到Maven的settings.xml中
  5. 密鑰生成以後把你的公鑰須要上傳到公鑰服務器,公鑰服務器之間會自動同步java

    • 列出你的密鑰 gpg --list-secret-keys 輸出中pub一行'/'後的8位HEX字符串就是密鑰ID
    • 上傳到服務器 gpg --keyserver keyserver.ubuntu.com --send-keys <密鑰ID>
    • 驗證上傳結果 gpg --keyserver keyserver.ubuntu.com --recv-keys <密鑰ID>

修改Maven的settings.xml文件

  • 在<servers>標籤中添加Sonatype登陸信息。Maven發佈jar包時須要使用。
<server>
      <!-- https://issues.sonatype.org/secure/Dashboard.jspa -->
      <id>ossrh</id>
      <username>你的Sonatype帳戶</username>
      <password>你的Sonatype密碼</password>
    </server>
  • 在<profiles>標籤中添加GPG的可執行文件名和私鑰密碼。maven-gpg-plugin插件運行時須要使用。
<profile>
      <id>ossrh</id>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
      <properties>
        <gpg.executable>gpg.exe</gpg.executable>
        <gpg.passphrase>GPG私鑰密碼</gpg.passphrase>
      </properties>
    </profile>

修改項目的pom.xml文件

  • 根據中央倉庫發佈要求(見參考),pom中須要提供必要的項目信息,如下元素缺一不可,不然沒法發佈:git

    • modelVersion
    • groupId
    • artifactId
    • version
    • packaging
    • name
    • description
    • url
    • licenses.license
    • developers.developer
    • scm.connection
    • scm.url
  • 須要提供源碼jar包和javadoc jar包,並使用gpg簽名,所以必須添加相應maven plugin
  • 須要添加distributionManagement以自動上傳到Sonatype
  • 下面是一個完整pom示例
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.github.rockswang</groupId>
  <artifactId>java-curl</artifactId>
  <version>1.2.0</version>
  <packaging>jar</packaging>

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

  <name>java-curl</name>
  <description>Ultra-lightweight CURL implementation in pure java 1.6</description>
  <url>https://github.com/rockswang/java-curl</url>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <!--Compiler-->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <configuration>
          <source>1.6</source>
          <target>1.6</target>
        </configuration>
      </plugin>
      <!-- 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>
        <configuration>
          <additionalparam>-Xdoclint:none</additionalparam><!-- 添加這個壓制JavaDoc檢查 -->
        </configuration>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>jar</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <!-- GPG mvn clean deploy -P release -Dgpg.passphrase=YourPassphase -->
      <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>

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

  <developers>
    <developer>
      <name>Rocks Wang</name>
      <email>rockswang@foxmail.com</email>
      <organization>roxstudio</organization>
      <url>https://github.com/rockswang</url>
    </developer>
  </developers>

  <scm>
    <connection>scm:git:https://github.com/rockswang/java-curl.git</connection>
    <developerConnection>scm:git:https://github.com/rockswang/java-curl.git</developerConnection>
    <url>https://github.com/rockswang/java-curl</url>
    <tag>1.2.0</tag>
  </scm>

  <distributionManagement>
    <snapshotRepository>
      <id>ossrh</id>
      <name>OSS Snapshots Repository</name>
      <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
    </snapshotRepository>
    <repository>
      <id>ossrh</id>
      <name>OSS Staging Repository</name>
      <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
    </repository>
  </distributionManagement>

</project>

構建和上傳

  • 在項目根目錄命令行運行 mvn clean deploy verify
  • 若代碼正確,配置正常,到這一步構建完便可自動打包並上傳到Sonatype的Staging倉庫
  • 注意:若是發佈正式版本則不要在版本號上添加-SNAPSHOT,不然會被上傳到Snapshot倉庫

發佈並同步到中央倉庫

  • 打開Sonatype倉庫管理頁面 https://oss.sonatype.org/,使用前面的Sonatype帳戶密碼登陸
  • 點擊左面菜單中的Staging Repositories,在右面的列表中拉到最下面,就能找到本身剛上傳的項目,選中它,點擊Close
  • 注意點擊Close以後,服務器會按照「中央倉庫發佈要求」逐項驗證你的包是否符合規格,大概須要1分鐘左右。若是close失敗了,點擊下部面板的Activity子面板,查看失敗緣由,而後從新close。
  • 成功Close以後,選中項目,點Release。發佈後,項目會自動從Staging列表中刪除。
  • 回到Sonatype的JIRA系統中,找到你的issue,加條備註告訴工做人員你已經成功發佈了,他們會幫你激活同步過程。只有首次提交須要這個步驟。
  • 同步到中央倉庫可能須要幾個小時,過段時間再去中央倉庫搜索吧。

參考

別人的流程:https://blog.csdn.net/liuhuan...
別人踩的坑:https://blog.csdn.net/h324321...
GPG密鑰的生成與使用 https://www.jianshu.com/p/7f1...
中央倉庫發佈要求:https://central.sonatype.org/...github

相關文章
相關標籤/搜索