001-將本身的jar提交maven中央倉

1、Maven中央倉庫提交過程

① https://issues.sonatype.org 工單管理地址,就是申請上傳資格和groupId 的地方。html

② https://oss.sonatype.org/#welcome  構件倉庫,把jar包上傳到這裏,Release 以後就會同步到maven中央倉庫。java

③ http://search.maven.org/  最終表如今能夠在這裏搜索到。git

利用Sonatype OSSRH能夠把jar等資源提交給Maven的中央倉庫。github

2、Sonatype OSSRH介紹

  Sonatype OSSRH使用Nexus 爲開源項目提供倉庫管理服務,該倉庫就是所謂maven的中央倉庫,OSSRH容許咱們向Maven中央倉庫提交二進制文件。apache

  1:提交(deploy)開發版本的二進制文件(snapshorts)json

  2: 階段性的發佈版本ubuntu

  3:發佈一個release,而後同步他們到中央倉庫。mybatis

3、工單使用

3.一、註冊帳號

https://issues.sonatype.org 註冊一個賬號,註冊地址,登陸帳號密碼後續還要配置  maven  的setting.xml 中,而後建立一個工單,以下圖(記住是先註冊,下面是建立工單的圖)。app

3.二、建立工單

  

  

注意:jsp

推薦設置方式

Group Id ,惟一標識,推薦使用com.github.xxxxx  ,xxxx要與github 用戶名一致,會大概5分鐘經過

  若是用的是其餘的好比:com.sojson.core 之類的,管理員會問你這個是否是屬於你的網站等等,官方文檔:http://central.sonatype.org/pages/choosing-your-coordinates.html 

② ProjectURL ,填項目源碼的地址,若是不想公佈源碼,那麼填寫一個只含README的項目的地址就能夠了。

*其實管理員主要就是審覈Group Id,其餘的不重要

而後點擊左側列表中的Resolved recently 能夠找到你剛建立的工單。

這時你的工單的狀態Status 是Open ,等到審覈經過狀態會變爲RESOLVED 

  

審查要求:

  • 一、提供JavaDoc和source
  • 二、使用gpg或者pgp對文件進行簽名
  • 三、正確的座標:groupId、artifactId、version
  • 四、projectName、description、url、license、developers、scm等信息

4、項目中的 pom.xml的基本配置

一、正確的座標

    <groupId>com.github.bjlhx15</groupId>
    <artifactId>xgen</artifactId>
    <version>1.0-SNAPSHOT</version>

二、項目信息描述、liscens、開發者、scm軟件配置管理

    <!-- 基礎信息-->
    <name>${project.groupId}:${project.artifactId}</name>
    <description>mybatis plugins</description>
    <url>https://github.com/bjlhx15/xgen</url>
    <!--開源協議-->
    <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>lihongxu</name>
            <email>bjlhx15@163.com</email>
            <url>https://github.com/bjlhx15/</url>
        </developer>
    </developers>
    <!-- 軟件配置管理-->
    <scm>
        <url>https://github.com/bjlhx15/xgen</url>
        <connection>scm:git:https://github.com/bjlhx15/xgen.git</connection>
        <developerConnection>scm:git:https://github.com/bjlhx15/xgen.git</developerConnection>
    </scm>

5、打包部署

方式1、maven的方式

5.一、POM配置要上傳的倉庫地址

    <!--定義snapshots庫和releases庫的nexus地址-->
    <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>

5.二、配置上傳中央倉庫的用戶名密碼

  配置到 戶密碼配置  須要在maven_home/conf/settings.xml配置jira的帳號和密碼【上文註冊的】

與pom中的 

  <!--定義snapshots庫和releases庫的nexus地址-->

  <distributionManagement>

對應
 <server>
    <id>sonatype-nexus-snapshots</id>
    <username>https://issues.sonatype.org的帳號</username>
    <password>https://issues.sonatype.org的密碼</password>
  </server>
  <server>
    <id>sonatype-nexus-staging</id>
    <username>https://issues.sonatype.org的帳號</username>
    <password>https://issues.sonatype.org的密碼</password>
  </server>

5.三、POM 配置生成javadoc和sources包的插件【使用第五部分的profiles】

  新建組件的時候,必須發佈javadoc和sources上去中央倉庫,具體命名是經過你在 pom中定義的 groupId,artifactId和version,這個java開發者通常都很熟悉了,再也不說明。

  最終打包的要求知足如下格式:artifactId-version-classifier.packaging 

    其中, artifactId 和 version 就不說了;關於classifier就是對這個包的說明,好比javadoc,或是sources, packaging表示包的形式,好比war、jar等

5.四、GPG加密和自動簽名的插件

a》基礎密鑰生成

  使用gpg或者pgp對文件進行簽名,發佈到Maven倉庫中的全部文件都要使用GPG簽名,以保障完整性。所以,咱們須要在本地安裝並配置GPG。

  通常的發佈文件都有一個對應的簽名文件,即 .asc 文件

  注、使用gpg生成密鑰,關於GPG的安裝使用:http://www.javashuo.com/article/p-vddenoov-em.html

mac安裝:brew install gpg

  基本使用:gpg --version

  生成密鑰對:gpg --gen-key

    期間會提示用戶名,郵箱  輸入密碼等,能夠看到生成了並放到用戶的文件夾下,包含公鑰和私鑰,最下面那部分就是生成的結果。其中輸入密碼是亂碼,由於是中文系統元嬰

  查看本機包含的密鑰對: gpg --list-keys  ;pub表示是公鑰,而sub表示私鑰。

  發佈公鑰到GPG key-servers,很是的關鍵的,Sonatype 公司須要一個公鑰來驗證你deploy的文件,默認發送send-keys 應該是pub_key_id , D17AD4F314772283A415624……

gpg --keyserver hkp://pool.sks-keyservers.net:11371 --send-keys D17AD4F314772283A41562431AF7567……
gpg --keyserver hkp://pgp.mit.edu:11371 --send-keys D17AD4F314772283A41562431AF7567……
gpg --keyserver hkp://keyserver.ubuntu.com:11371 --send-keys D17AD4F314772283A41562431AF7567……

   上傳時候老是報錯

    

嘗試使用如下上傳

gpg --keyserver hkp://keyserver.ubuntu.com:80 --send-keys D17AD4F314772283A41562431AF7567……

使用查看命令查看

gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys D17AD4F314772283A41562431AF7567…… 

b》POM 配置【使用第五部分的profiles】

5.五、使用Profile修改pom文件

應該javadoc和source的jar包生成也須要使用gpg來簽名,因此很浪費時間,並且這些執行一般都獨立於標準構建流程,因此把他們移動到一個profile.

由於插件也須要下載,可使用pom中的dependencies下載後 在刪除掉

        <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils-core</artifactId>
            <version>1.8.3</version>
        </dependency>

        <!--打包插件-->
        <dependency>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-release-plugin</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.sonatype.plugins</groupId>
            <artifactId>nexus-staging-maven-plugin</artifactId>
            <version>1.6.8</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-gpg-plugin</artifactId>
            <version>1.5</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-javadoc-plugin</artifactId>
            <version>2.9.1</version>
            <scope>provided</scope>
        </dependency>
View Code

如下是環境配置

    <!--綜合打包信息-->
    <profiles>
        <!--快照版本-->
        <!--mvn clean deploy -P snapshots -Dmaven.test.skip=true -->
        <profile>
            <id>snapshots</id>
            <build>
                <plugins>
                    <!--用來將工程發佈到中央倉庫-->
                    <plugin>
                        <groupId>org.sonatype.plugins</groupId>
                        <artifactId>nexus-staging-maven-plugin</artifactId>
                        <version>1.6.8</version>
                        <extensions>true</extensions>
                        <configuration>
                            <serverId>sonatype-nexus-snapshots</serverId>
                            <nexusUrl>https://oss.sonatype.org/</nexusUrl>
                            <autoReleaseAfterClose>true</autoReleaseAfterClose>
                        </configuration>
                    </plugin>
                    <!-- maven relaese-->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-release-plugin</artifactId>
                        <version>2.5</version>
                        <configuration>
                            <autoVersionSubmodules>true</autoVersionSubmodules>
                            <useReleaseProfile>false</useReleaseProfile>
                            <releaseProfiles>release</releaseProfiles>
                            <goals>deploy</goals>
                        </configuration>
                    </plugin>
                    <!-- maven 編譯-->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-compiler-plugin</artifactId>
                        <version>3.0</version>
                        <configuration>
                            <source>1.8</source>
                            <target>1.8</target>
                        </configuration>
                    </plugin>
                    <!-- 源碼打包插件-->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-source-plugin</artifactId>
                        <version>2.2.1</version>
                        <executions>
                            <execution>
                                <id>attach-sources</id>
                                <goals>
                                    <goal>jar-no-fork</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                    <!--生成Javadoc,關閉doclint,避免註解檢查不經過-->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-javadoc-plugin</artifactId>
                        <version>2.9.1</version>
                        <executions>
                            <execution>
                                <id>attach-javadocs</id>
                                <goals>
                                    <goal>jar</goal>
                                </goals>
                            </execution>
                        </executions>
                        <configuration>
                            <!-- 解決 java8 下發布到 maven 中心庫時,生成 doc 的異常 -->
                            <additionalparam>-Xdoclint:none</additionalparam>
                            <encoding>${project.build.sourceEncoding}</encoding>
                            <outputDirectory>${basedir}</outputDirectory>
                            <reportOutputDirectory>${basedir}</reportOutputDirectory>
                        </configuration>
                    </plugin>

                    <!-- GPG自動簽名的插件-->
                    <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>

        <!--release-->
        <!--mvn clean deploy -P release -Dmaven.test.skip=true -->
        <profile>
            <id>release</id>
            <build>
                <plugins>
                    <!--用來將工程發佈到中央倉庫-->
                    <plugin>
                        <groupId>org.sonatype.plugins</groupId>
                        <artifactId>nexus-staging-maven-plugin</artifactId>
                        <version>1.6.8</version>
                        <extensions>true</extensions>
                        <configuration>
                            <serverId>sonatype-nexus-staging</serverId>
                            <nexusUrl>https://oss.sonatype.org/</nexusUrl>
                            <autoReleaseAfterClose>true</autoReleaseAfterClose>
                        </configuration>
                    </plugin>
                    <!-- maven relaese-->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-release-plugin</artifactId>
                        <version>2.5</version>
                        <configuration>
                            <autoVersionSubmodules>true</autoVersionSubmodules>
                            <useReleaseProfile>false</useReleaseProfile>
                            <releaseProfiles>release</releaseProfiles>
                            <goals>deploy</goals>
                        </configuration>
                    </plugin>
                    <!-- maven 編譯-->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-compiler-plugin</artifactId>
                        <version>3.0</version>
                        <configuration>
                            <source>1.8</source>
                            <target>1.8</target>
                        </configuration>
                    </plugin>
                    <!-- 源碼打包插件-->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-source-plugin</artifactId>
                        <version>2.2.1</version>
                        <executions>
                            <execution>
                                <id>attach-sources</id>
                                <goals>
                                    <goal>jar-no-fork</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                    <!--生成Javadoc,關閉doclint,避免註解檢查不經過-->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-javadoc-plugin</artifactId>
                        <version>2.9.1</version>
                        <executions>
                            <execution>
                                <id>attach-javadocs</id>
                                <goals>
                                    <goal>jar</goal>
                                </goals>
                            </execution>
                        </executions>
                        <configuration>
                            <!-- 解決 java8 下發布到 maven 中心庫時,生成 doc 的異常 -->
                            <additionalparam>-Xdoclint:none</additionalparam>
                            <encoding>${project.build.sourceEncoding}</encoding>
                            <outputDirectory>${basedir}</outputDirectory>
                            <reportOutputDirectory>${basedir}</reportOutputDirectory>
                        </configuration>
                    </plugin>

                    <!-- GPG自動簽名的插件-->
                    <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>

5.六、編譯打包上傳

5.6.一、快照版本【上傳後便可使用】

mvn clean deploy -P snapshots -Dmaven.test.skip=true

測試在pom上配置

    <repositories>
        <repository>
            <id>sonatype-snapshots</id>
            <name>snapshot</name>
            <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
            <snapshots>
                <enabled>true</enabled>
                <!-- 4種頻率類型。若是配置間隔時間更新,能夠寫做 interval:XX (XX是間隔分鐘數)。daily配置是默認值。-->
                <!-- A. always是每次都去遠程倉庫查看是否有更新,-->
                <!-- B. daily是隻在天天第一次的時候查看是否有更新,當天的其它時候則不會查看;-->
                <!-- C .interval容許設置一個分鐘爲單位的間隔時間,在這個間隔時間內只會去遠程倉庫中查找一次;-->
                <!-- D .never是不會去遠程倉庫中查找(這種就和正式版本的行爲同樣了)。-->
                <updatePolicy>interval:5</updatePolicy>
            </snapshots>
        </repository>
    </repositories>

 

5.6.二、release版本

能夠繼續增長一個profile配置 

mvn clean deploy -P release -Dmaven.test.skip=true

注意修改nexus-staging-maven-plugin的configuration地址serverId

使用時候直接配置依賴便可

5.6.三、注意事項問題點

問題1、針對上述,出現問題:

  gpg: signing failed: Inappropriate ioctl for device

   Failed to execute goal org.apache.maven.plugins:maven-gpg-plugin:1.6:sign (sign-artifacts) on project xgen: Exit code: 2 -> [Help 1]  

解決方案:

嘗試1、使用的版本是maven3.X,其執行maven-ant-plugin的行爲和maven2.x有必定的不一樣,須要引入pluginManagement

  <build>   <plugins>      <plugin></plugin>增長節點  <build>   <pluginManagement>   <plugins>      <plugin></plugin>

嘗試2、增長跳過test處理

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>maven-gpg-plugin</artifactId>
    <configuration>
        <skip>true</skip>
    </configuration>
</plugin>

嘗試3、在運行上述命令窗口:export GPG_TTY=$(tty),再次運行,能夠彈出輸入密碼窗口

問題2、Return code is: 401, ReasonPhrase: Unauthorized. -> [Help 1]

  注意修改本機maven的指向setting ,能夠經過mvn -X 查看 

  maven-help-plugin是一個小巧的輔助工具,最簡單的help:system能夠打印全部可用的環境變量和Java系統屬性。help:effective-pom和help:effective-settings最爲有用。

  help:effective-pom用於查看當前生效的POM內容,指合併了全部父POM(包括Super POM)後的XML,因此可用於檢測POM中某個配置是否生效

  effective-settings可用於查看當前生效的settings.xml文件內容,因此可用於判斷某個settings配置是否生效

因爲release版本是必需要簽名的,因此須要測試簽名,

方法1、在maven的settings.xml中配置gpg的簽名 :(須要先用gpg來生成 a 步驟)

    <!-- 環境變量預POM對應 -->
    <profile>
      <id>sonatype-nexus-snapshots</id>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
      <properties>
        <!-- 此處根據GPG版本填寫,<2.0的填寫GPG,2.0以上的填寫gpg2 -->
        <gpg.executable>gpg2</gpg.executable>
        <gpg.passphrase>密碼</gpg.passphrase>
      </properties>
    </profile>

方法2、增長編譯參數  

mvn clean deploy -Prelease -Dmaven.test.skip=true -Dgpg.passphrase=<輸入你的密碼>

問題:zsh: no matches found: -Dgpg.passphrase=密碼

  具體緣由:由於zsh缺省狀況下始終本身解釋這個 *.h,而不會傳遞給 find 來解釋。

  解決辦法:在~/.zshrc中加入:setopt no_nomatch, 而後進行source .zshrc命令

5.七、登陸https://oss.sonatype.org/#welcome,使用上述帳號便可,在 OSS 中發佈構件

會在中間倉庫中Staging Repositories 菜單中看到本身剛剛上傳的jar 包,

若是沒有錯的話,選中它,close關閉後,而後點Release 就能夠同步到中央倉庫了,通常過十分鐘左右就能在http://search.maven.org/上邊搜到了。

若是在配置中有配置:<autoReleaseAfterClose>true</autoReleaseAfterClose>,那麼會自動關閉,自動發佈。可能就不須要上述操做了。而後也搜索不到的。

5.八、通知 Sonatype 構件已成功發佈

一、 在以前的在Issue下面回覆

在 Issue 下面回覆一條「構件已成功發佈」的評論,這是爲了通知 Sonatype 的工做人員爲須要發佈的構件作審批,發佈後會關閉該 Issue。

這個前面的 Sonatype 工做人員其實在審覈 Issue 時,在 comment 中已經提示了.https://issues.sonatype.org

二、等待構件審批經過

當審批經過後,將會收到郵件通知。通常一天左右

三、從中央倉庫中搜索構件

這時,就能夠在 maven 的中央倉庫中搜索到本身發佈的構件了,之後能夠直接在 pom.xml 中使用了!

中央倉庫搜索網站:http://search.maven.org/

第一次成功發佈以後,之後就不用這麼麻煩了,能夠直接使用 groupId 發佈任何的構件,固然前提是 groupId 沒有變。

四、後續其餘jar的發佈流程

a)構件完成後直接使用 maven 在命令行上傳構建;固然groupId 沒有變的狀況下,若是變更就須要從新申請工單

b)在 https://oss.sonatype.org/ close 並 release 構件;

c) 等待同步好(大約2小時多)以後,就可使用了

相關文章
相關標籤/搜索