提交項(xiàng)目到Maven中央倉(cāng)庫(kù)

之前提到我寫了一個(gè)讀取ply格式的工具放到了Github上横堡,想要引用這個(gè)庫(kù)可以用 mvn package 把 jar 打包出來(lái),但是我習(xí)慣了在 pom.xml 中引入依賴項(xiàng)卷扮,我就想能否直接把那個(gè)庫(kù)提交到Maven倉(cāng)庫(kù)上,斷斷續(xù)續(xù)弄了幾天最后真的放上去了。其實(shí)整個(gè)過(guò)程還算簡(jiǎn)單杖们,主要就參考了一篇中文博客,這里大概把遇到的問(wèn)題記一下肩狂。

申請(qǐng)創(chuàng)建 Project

第一步是去 Sonatype注冊(cè)一個(gè)賬號(hào)摘完。完成注冊(cè)進(jìn)入 Dashboard 后點(diǎn)擊最上方的 Create :

頁(yè)面會(huì)彈出一個(gè)模態(tài)框,把該填的填上傻谁,所有描述性的輸入我都用英文孝治,至于 Usernames 那一欄,雖然我估計(jì)不用填审磁,但還是把自己在 Sonatype 上的用戶名給填進(jìn)去了谈飒。


然后就等待審核,我大概等了 5 天左右态蒂,不必每天登錄上去看杭措,審核通過(guò)后會(huì)有郵件通知。
審核通過(guò)后钾恢,我啥也沒(méi)管手素,也沒(méi)有像別的博客里提到的 close issue 之類的操作。

補(bǔ)全項(xiàng)目 pom.xml 中的信息

先不說(shuō)如何部署到倉(cāng)庫(kù)上瘩蚪,先說(shuō)幾個(gè)必要的步驟泉懦。
pom.xml 中有些信息是必須的:

  • 項(xiàng)目描述(description)
  • 開源許可 (license)
  • 開發(fā)者信息(developers)
  • 去哪提 issue(issueManagement)
  • 版本控制(scm)
    當(dāng)時(shí)我不知道,缺了好多疹瘦,提交上去就報(bào)了錯(cuò)崩哩。后來(lái)就照葫蘆畫瓢把信息補(bǔ)上去了:
<?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>cn.jimmiez</groupId>
  <artifactId>pcutil</artifactId>
  <version>0.0.3</version>
  <description>A 3d point cloud utility.</description>
  <name>pcutil</name>
  <url>http://www.jimmiez.cn/pcu/</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>

  </properties>

  <packaging>jar</packaging>

  <licenses>
    <license>
      <name>MIT License</name>
      <url>https://opensource.org/licenses/MIT</url>
      <distribution>repo</distribution>
    </license>
  </licenses>

  <developers>
    <developer>
      <email>cquzjl@gmail.com</email>
      <name>Jianling Zhou</name>
      <url>https://github.com/Jimmie00x0000</url>
      <id>Jimmie00x0000</id>
    </developer>
  </developers>

  <issueManagement>
    <url>https://github.com/Jimmie00x0000/PointCloudUtil/issues</url>
    <system>GitHub Issues</system>
  </issueManagement>
  <scm>
    <url>https://github.com/Jimmie00x0000/PointCloudUtil</url>
    <connection>scm:git:https://git@github.com/Jimmie00x0000/PointCloudUtil.git</connection>
  </scm>



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

  <dependencies>
    
  </dependencies>

  <build>
    <resources>
      <resource>
        <directory>${basedir}/src/main/resources</directory>
      </resource>
    </resources>
    <testResources>
      <testResource>
        <directory>${basedir}/src/test/resources</directory>
      </testResource>

    </testResources>
    <plugins>
      <plugin>
        <artifactId>maven-clean-plugin</artifactId>
        <version>3.0.0</version>
      </plugin>
      <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
      <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>
      <plugin>
        <artifactId>maven-resources-plugin</artifactId>
        <version>3.0.2</version>
      </plugin>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.7.0</version>
      </plugin>
      <plugin>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.20.1</version>
      </plugin>
      <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.0.2</version>
      </plugin>
      <plugin>
        <artifactId>maven-install-plugin</artifactId>
        <version>2.5.2</version>
      </plugin>
      <plugin>
        <artifactId>maven-site-plugin</artifactId>
        <version>3.3</version>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-project-info-reports-plugin</artifactId>
        <version>2.7</version>
      </plugin>
      <plugin>
        <artifactId>maven-deploy-plugin</artifactId>
        <version>2.8.2</version>
      </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>
            <configuration>
              <keyname>${gpg.keyname}</keyname>
              <passphraseServerId>${gpg.keyname}</passphraseServerId>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <version>3.0.1</version>
        <executions>
          <execution>
            <id>attach-javadocs</id>
            <goals>
              <goal>jar</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

文檔信息

這一部分我不是很確定,因?yàn)槲覒岩?javadoc 不是必須的言沐。
我第一次提交出了錯(cuò)邓嘹,除了 pom.xml 中缺了信息外,Nexus 系統(tǒng)還告訴我沒(méi)有附上 source 和 javadoc险胰。

格式

然后我就研究了下吴超,首先,你需要確保你的 JavaDoc 沒(méi)有格式上的錯(cuò)誤鸯乃,對(duì)于你的庫(kù)的API鲸阻,你可以不寫doc跋涣,但是一定要保證沒(méi)有格式上的錯(cuò)誤。常見(jiàn)的錯(cuò)誤:

  • 寫了 @param 鸟悴,忘了 @return
/**
 * this is another api, bala bala
 * @param foo is to xxx
 **/
public int api1(String foo) {
    // ....
    return 0;
}
  • 在標(biāo)簽以外的地方亂用尖括號(hào) > 和 <
/**
 * this is an api , you can refer to -> cn.edu.cqu.xxx.
 * @param foo is to xxx
 * @return status code
 **/
public int api2(String foo) {
    // ....
    return 0;
}

像 IntelliJ IDEA 這樣的 IDE會(huì)在你 doc 錯(cuò)誤的地方提示的陈辱,所以不要忽視 IDE 的警告。

附上 doc

為此我去翻了 apache maven-doc plugin 的文檔细诸,最后發(fā)現(xiàn)的簡(jiǎn)單的辦法好像就是在 pom.xml 中聲明插件就 OK了:

<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>
<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <version>3.0.1</version>
        <executions>
          <execution>
            <id>attach-javadocs</id>
            <goals>
              <goal>jar</goal>
            </goals>
          </execution>
        </executions>
      </plugin>

想要驗(yàn)證能否無(wú)錯(cuò)誤地生成javadoc的話沛贪,可以在項(xiàng)目的根目錄下執(zhí)行

mvn site

之后根目錄下的 target 目錄下就會(huì)出現(xiàn) site 目錄,點(diǎn)擊進(jìn)去就可以看到根據(jù)你的 doc 生成的網(wǎng)頁(yè)了震贵。注意生成site這個(gè)目錄只是一個(gè)調(diào)試行為利赋,并不是上傳到Maven倉(cāng)庫(kù)所需要的命令

在這里我踩了一個(gè)坑猩系,就是我用 IDEA 的自帶工具媚送,結(jié)果并不能生成 javadoc ,不知何故寇甸。

簽名

想要上傳到倉(cāng)庫(kù)塘偎,jar 包必須被簽名,這一步略麻煩拿霉。首先要下載 gpg4win吟秩,下載地址

安裝好后绽淘,需要生成簽名所需要的公私鑰對(duì)涵防,進(jìn)入命令行,輸入

gpg --gen-key

之后需要輸入一些信息沪铭,像名字之類的壮池,可以和 Sonatype 里的不一樣,之后會(huì)彈個(gè)框讓你設(shè)置一個(gè)密碼伦意,這個(gè)密碼一定要記住火窒,之后部署的時(shí)候需要輸入硼补。

安裝了 gpg4win 后應(yīng)該還會(huì)裝上一個(gè) Kleopatra 的客戶端驮肉,打開這個(gè)軟件,右鍵你剛才生成證書已骇,點(diǎn)擊“在服務(wù)器上發(fā)布”离钝。


之后在 Maven 的 setting.xml 的 servers 標(biāo)簽下插入如下信息

<server>
        <id>sonatype</id>
        <username>你在sonatype上的用戶名</username>
        <password>你在sonatype上的密碼</password>
      </server>

部署到倉(cāng)庫(kù)

搞定了上述步驟后,在項(xiàng)目根目錄下輸入如下命令褪储。如果最后看到了 BUILD SUCCESS卵渴,基本就沒(méi)有太大問(wèn)題了。

mvn deploy -X

使用 Sonatype 的用戶名和密碼鲤竹,進(jìn)入倉(cāng)庫(kù)的管理頁(yè)面浪读。注意上傳成功后這次提交在Nexus Repo Manager 只會(huì)處于一個(gè)暫存的狀態(tài)昔榴。

想要發(fā)布到中央倉(cāng)庫(kù),先通過(guò)包名找到你的倉(cāng)庫(kù)(如果找不到說(shuō)明沒(méi)有上傳成功碘橘,回去看看是不是忘了在 pom.xml 里指定 distributionManagement),選中倉(cāng)庫(kù),上面有 close 可選牲蜀。先close喊废,再release。但是點(diǎn)擊close不一定會(huì)成功纺蛆,因?yàn)橄到y(tǒng)會(huì)檢查你這次提交吐葵,比如javadoc有沒(méi)有問(wèn)題,有沒(méi)有簽名桥氏,有沒(méi)有缺少信息之類的温峭,檢查的結(jié)果可以在下方的 Activity 標(biāo)簽頁(yè)看到。

如果 close 失敗识颊,可以點(diǎn)擊 drop 放棄這次提交诚镰,記得當(dāng)時(shí)我還猶豫了會(huì),在想這個(gè) drop 會(huì)不會(huì)直接把 Project 給 drop 掉祥款,事實(shí)證明不會(huì)清笨。

如果 close 成功了,點(diǎn)擊 release刃跛。不出啥意外的話大概等待五六個(gè)小時(shí)就可以在中央倉(cāng)庫(kù)上查到你的庫(kù)了抠艾。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市桨昙,隨后出現(xiàn)的幾起案子检号,更是在濱河造成了極大的恐慌,老刑警劉巖蛙酪,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件齐苛,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡桂塞,警方通過(guò)查閱死者的電腦和手機(jī)凹蜂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)阁危,“玉大人玛痊,你說(shuō)我怎么就攤上這事】翊颍” “怎么了擂煞?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)趴乡。 經(jīng)常有香客問(wèn)我对省,道長(zhǎng)蝗拿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任蒿涎,我火速辦了婚禮蛹磺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘同仆。我一直安慰自己萤捆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布俗批。 她就那樣靜靜地躺著俗或,像睡著了一般。 火紅的嫁衣襯著肌膚如雪岁忘。 梳的紋絲不亂的頭發(fā)上辛慰,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音干像,去河邊找鬼帅腌。 笑死,一個(gè)胖子當(dāng)著我的面吹牛麻汰,可吹牛的內(nèi)容都是我干的速客。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼五鲫,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼溺职!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起位喂,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤浪耘,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后塑崖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體七冲,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年规婆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了澜躺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡聋呢,死狀恐怖苗踪,靈堂內(nèi)的尸體忽然破棺而出颠区,到底是詐尸還是另有隱情削锰,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布毕莱,位于F島的核電站器贩,受9級(jí)特大地震影響颅夺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蛹稍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一吧黄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧唆姐,春花似錦拗慨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至声功,卻和暖如春烦却,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背先巴。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工其爵, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人伸蚯。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓摩渺,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親剂邮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子证逻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容