之前提到我寫了一個(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ù)了抠艾。