前言
此次將自己的項(xiàng)目推送到Maven中央庫的經(jīng)歷簡(jiǎn)直慘不忍睹蝌蹂,俗話說噩斟,凡事都有第一次,越是慘痛的經(jīng)驗(yàn)就越是印象深刻叉信,但還是怕以后會(huì)忘記某些步驟亩冬,所以還是記錄一下,供自己也供大家參考參考硼身。
首先硅急,我訴苦一下,網(wǎng)上的各種文章我基本都翻了個(gè)遍佳遂,百度/Google出來的大流程基本都一樣营袜,就像是同一個(gè)模子里刻出來的一樣,但整體過程是沒問題的丑罪,一步一步照著來就行了荚板,最值得一提的是在我們操作過程中出現(xiàn)的各種各樣的奇葩問題,這個(gè)東西只有在實(shí)際操作中才會(huì)出現(xiàn)的問題就很難搜到有效的解決方案了吩屹,因操作而異出現(xiàn)的問題也各有不同跪另,加上身邊的小伙伴對(duì)這個(gè)了解也是甚少,就算有那么一兩個(gè)曾經(jīng)弄過這個(gè)也沒幾個(gè)人有這方面詳細(xì)的記錄過程煤搜,所以就算他們憑借著模糊的記憶告訴了你一些經(jīng)驗(yàn)免绿,但也提供不了什么實(shí)質(zhì)性的幫助,還是只有靠自己慢慢摸索前行擦盾,而我自己在經(jīng)歷了差不多快一周撓破腦袋的各種百度/Google下終于有所進(jìn)展嘲驾,皇天不負(fù)有心人,最后成功將項(xiàng)目上傳至Maven中央庫迹卢,可以正常使用也可以正常后續(xù)維護(hù)唐片,想想過程雖苦但結(jié)果是欣慰的蟋恬。
好了球恤,這里說一下實(shí)際操作蛹疯,文中可能 廢話 比較多,如果閱讀文章的同學(xué)耐心不強(qiáng)症见,認(rèn)為咱很羅嗦喂走,對(duì)你沒什么用,認(rèn)為多此一舉筒饰,那要么請(qǐng)您點(diǎn)擊上面那個(gè)耀眼的關(guān)閉按鈕再去找其他文章參考吧缴啡,否則請(qǐng)您耐著性子慢慢看完它壁晒,當(dāng)然您也可以選擇性查看瓷们,如果到最后您還是認(rèn)為這篇文章對(duì)您沒有任何幫助,那對(duì)不起,是在下錯(cuò)了谬晕,告辭 o(︶︿︶)o
1碘裕、代碼托管
這一步有多重要我就不在這里贅述了,將你認(rèn)為可以發(fā)布的項(xiàng)目托管到 github/gitee 上攒钳,如果你已經(jīng)完成了這個(gè)步驟當(dāng)然很好帮孔,但如果還有沒有完成這個(gè)步驟甚至不了解代碼托管平臺(tái)的同學(xué),請(qǐng)自行百度/Google相關(guān)操作不撑,如果說作為一個(gè)合格的所謂的 程序猿文兢,你甚至都沒有使用全球最有名的 “同性” 交友網(wǎng)站的話,你就真的有點(diǎn)Out了焕檬,廢話不多說姆坚,這步你自己掂量著來。实愚。兼呵。
完成你的代碼托管之后,記錄下你的項(xiàng)目地址( https://github.com/tangxbai/mybatis-mapper.git )后面需要用到腊敲。
2击喂、需要一個(gè) Sonatype 賬號(hào)
當(dāng)然,Maven中央庫也不是你想發(fā)什么就發(fā)生么的碰辅,必須有人維護(hù)有人審核懂昂,有人同意你這么干你才能發(fā)布自己的應(yīng)用。 https://issues.sonatype.org 這個(gè)網(wǎng)站就是問題管理系統(tǒng)乎赴,和我們平時(shí)用的 JIRA 系統(tǒng)類似忍法,流程無異,只不過工作人員是美國的同學(xué)榕吼。
小提示:審核過程是由美國那邊的同學(xué)完成的饿序,因時(shí)區(qū)差異,中國和美國時(shí)間相差大概12小時(shí)羹蚣,如果你在白天提交操作的話原探,美國那邊是應(yīng)該是夜晚早就下班了,所以你提交審核的時(shí)間看準(zhǔn)時(shí)機(jī)顽素,或者提交之后慢慢等待也行咽弦,時(shí)機(jī)恰當(dāng)?shù)脑捯粌蓚€(gè)小時(shí)之內(nèi)就會(huì)完成審核,最長(zhǎng)不會(huì)超過一個(gè)工作日胁出⌒托停回復(fù)記得使用英文,因?yàn)檎l也不確定別人是否能看得懂中文全蝶。
1闹蒜、注冊(cè)賬號(hào)(已經(jīng)有賬號(hào)的同學(xué)相信你也已經(jīng)輕車熟路了寺枉,略過吧)
去官網(wǎng)注冊(cè)一個(gè)賬號(hào),怎么注冊(cè)這種問題我就不用說了吧绷落,注冊(cè)成功后登錄可以點(diǎn)擊 頭像/用戶信息/參數(shù)配置 設(shè)置首選語言姥闪,我這里設(shè)置的是簡(jiǎn)體中文,我就不貼圖了砌烁,各位請(qǐng)自行選擇筐喳,英文較好的同學(xué)可以忽略此步驟。
2函喉、創(chuàng)建一個(gè) issue
找到工具條上面的 新建/Create 按鈕避归,點(diǎn)擊打開彈框表單,項(xiàng)目選擇 Community Support - Maven Central (MVNCENTRAL) 就好了管呵,其他就看著填寫吧槐脏,完了點(diǎn)擊 **新建/Create ** 創(chuàng)建一個(gè)issue。以下是部分示例撇寞,提供給各位同學(xué)參考顿天。
3、SCM url / Project URL
這兩個(gè)填寫你github/gitee的地址即可蔑担。
4牌废、Group Id 說明
這里值得注意的一點(diǎn)是其中的 Group Id, 如果你填寫的是個(gè)人域名的話啤握,審核時(shí)需要驗(yàn)證當(dāng)前域名是否為你本人所有鸟缕,如果沒有的話可以填寫github對(duì)應(yīng)的個(gè)人地址。
5排抬、個(gè)人域名驗(yàn)證(github個(gè)人地址不需要這一步)
個(gè)人域名驗(yàn)證也挺簡(jiǎn)單懂从,需要在你所在的域名管理商控制臺(tái)中添加一條DNS域名解析記錄,類型為 TXT蹲蒲,值為你的Issue地址番甩,類似于 https://issues.sonatype.org/browse/OSSRH-52222 ,添加完成生效后去你的issue下面添加一條評(píng)論届搁,告訴他 “這是你自己的域名”缘薛,然后等待工作人員的回復(fù),如果沒有通過的話他會(huì)告訴你具體原因卡睦,通過之后如下圖宴胧,那么就可以正常進(jìn)行項(xiàng)目發(fā)布了。
小提示:如何驗(yàn)證自己的TXT記錄已經(jīng)生效了呢表锻?見下圖恕齐,如果有這樣的結(jié)果就說明記錄生效了
6、等待審核
審核通過后平臺(tái)會(huì)告訴你結(jié)果瞬逊,如果沒有通過显歧,修改后填寫備注信息再次提交等待審核即可补胚,通過后大概如下,意思就是已經(jīng)為我們準(zhǔn)備好了相關(guān)信息追迟,可以正常發(fā)布項(xiàng)目了。
6骚腥、最后一步
當(dāng)你第一個(gè)項(xiàng)目發(fā)布之后敦间,再回來添加一個(gè)評(píng)論,告訴平臺(tái)你已經(jīng)構(gòu)建完成束铭,然后可以關(guān)閉此issue了廓块。以后再在同一個(gè) Group Id 下發(fā)布任何項(xiàng)目都不需要這些流程了。
至此契沫,Sonatype的準(zhǔn)備工作就結(jié)束了带猴。
3、完善 pom.xml
以下是參考列表懈万,加粗部分是比較重要的幾個(gè)信息:
name - 項(xiàng)目名稱
groupId - 你在issue中申請(qǐng)用到的 Group Id拴清,必須一樣,否則發(fā)布校驗(yàn)通不過
artifactId - 同一個(gè)Group下唯一的項(xiàng)目Id
version - 項(xiàng)目版本会通,對(duì)應(yīng)中央庫的版本口予,升級(jí)或者發(fā)版依賴這個(gè)版本號(hào)
url - 項(xiàng)目地址,可以寫你自己的域名也可以寫你github/gitee的倉庫地址
description - 項(xiàng)目描述涕侈,發(fā)布到中央庫會(huì)顯示這個(gè)備注信息
licenses - 項(xiàng)目開源協(xié)議沪停,根據(jù)自己選擇添加對(duì)應(yīng)的許可證說明
scm - 項(xiàng)目倉庫地址,一般就是github/gitee的倉庫地址
developers - 開發(fā)者列表
contributors - 貢獻(xiàn)者列表裳涛,如果有的話
distributionManagement - 填寫之前sonatype中工作人員審核通過提供給你的地址
build - 構(gòu)建打包
inceptionYear - 非必須木张,成立年份
organization - 非必須,組織的話可以加上這個(gè)說明
profiles - 非必須端三,環(huán)境選擇舷礼,完善的話可以加上這個(gè)
dependencies - 非必須,依賴模塊
issueManagement - 非必須郊闯,issue問題管理系統(tǒng)且轨,一般寫githu/gitee的issue地址就行了
完整示例
<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.viiyue.plugins</groupId>
<artifactId>mybatis-mapper</artifactId>
<version>1.1.1</version>
<packaging>jar</packaging>
<!-- 描述信息 -->
<name>mybatis-mapper</name>
<url>https://github.com/tangxbai/mybatis-mapper</url>
<description>
Mybatis generic mapper plugin for solving most basic operations,
simplifying sql syntax and improving dynamic execution efficiency
</description>
<!-- 項(xiàng)目成立年份,非必須 -->
<inceptionYear>2017</inceptionYear>
<!-- 許可證虚婿,最好是加上避免以后產(chǎn)生不必要的麻煩 -->
<licenses>
<license>
<name>The Apache Software License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
</license>
</licenses>
<!-- 倉庫地址旋奢,scm:xxx:xxx 是一種協(xié)議,看著寫就行了git的話一般就是scm:git:git -->
<scm>
<url>https://github.com/tangxbai/mybatis-mapper.git</url>
<connection>scm:git:git@github.com:tangxbai/mybatis-mapper.git</connection>
<developerConnection>scm:git:git@github.com:tangxbai/mybatis-mapper.git</developerConnection>
<tag>HEAD</tag>
</scm>
<!-- 問題管理系統(tǒng)然痊,非必須至朗,寫上最好 -->
<issueManagement>
<system>GitHub Issue Management</system>
<url>https://github.com/tangxbai/mybatis-mapper/issues</url>
</issueManagement>
<!-- 發(fā)布管理,要想發(fā)布到中央庫就必須要配置的一個(gè)節(jié)點(diǎn)剧浸,以下兩個(gè)鏈接可以從issue審核結(jié)果中找到 -->
<!-- 其中id為自定義锹引,后面會(huì)在maven/config/settings.xml中配置對(duì)應(yīng)的服務(wù)器信息 -->
<distributionManagement>
<snapshotRepository>
<id>ossrh</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
</snapshotRepository>
<repository>
<id>ossrh</id>
<url>https://oss.sonatype.org/service/local/staging/deploy/maven2</url>
</repository>
</distributionManagement>
<!-- 開發(fā)者列表矗钟,個(gè)人的話就寫自己,團(tuán)隊(duì)就羅列所有成員 -->
<developers>
<developer>
<name>tangxbai</name>
<email>tangxbai@hotmail.com</email>
<timezone>GMT+8</timezone>
<url>https://github.com/tangxbai</url>
</developer>
</developers>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- License許可證源文件頭部信息插件要用的配置嫌变,非必須 -->
<license.licenseName>apache_v2</license.licenseName>
<license.verbose>false</license.verbose>
<license.failOnMissing>true</license.failOnMissing>
<license.failOnUnknown>true</license.failOnUnknown>
<license.failIfWarning>true</license.failIfWarning>
<license.failOnForbidden>true</license.failOnForbidden>
<license.organizationName>${project.name}</license.organizationName>
<license.sectionDelimiter>#</license.sectionDelimiter>
<license.processStartTag>Start tag</license.processStartTag>
<license.processEndTag>End tag</license.processEndTag>
<license.xxx>...</license.xxx>
</properties>
<!-- 模塊依賴吨艇,非必須 -->
<dependencies>...</dependencies>
<!-- 打包插件 -->
<build>
<plugins>
<!-- Maven編譯插件,非必須腾啥,打包后生成 xxx.jar -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<!-- Java源代碼插件东涡,非必須,打包后生成 xxx-sources.jar -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- Javadoc倘待,文檔插件疮跑,非必須,打包后生成 xxx-javadoc.jar -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<!-- Jdk1.8以后文檔的生成校驗(yàn)非常嚴(yán)謹(jǐn)凸舵,這里可以關(guān)掉文檔校驗(yàn)-->
<doclint>none</doclint>
<applyJavadocSecurityFix>false</applyJavadocSecurityFix>
<failOnError>false</failOnError>
<failOnWarnings>false</failOnWarnings>
<additionalparam>-Xdoclint:none</additionalparam>
<additionalJOption>-Xdoclint:none</additionalJOption>
</configuration>
</execution>
</executions>
</plugin>
<!-- GPG簽名校驗(yàn)祖娘,必須,這個(gè)很重要啊奄,上傳到中央庫時(shí)用來驗(yàn)證簽名很重要的一個(gè)憑證 -->
<!-- 后面關(guān)于GPG簽名會(huì)詳細(xì)說到渐苏,這里先添加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>
<!-- License,非必須菇夸,用于在源文件頭部生成一段許可證文本注釋 -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>license-maven-plugin</artifactId>
<version>2.0.0</version>
<executions>
<execution>
<id>generate-license-headers</id>
<goals>
<goal>update-file-header</goal>
</goals>
<phase>process-sources</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
至此整以,項(xiàng)目方面的配置完成。
4峻仇、Maven配置
嗯公黑,項(xiàng)目神馬的都配置好了,那么又有很多問題來了摄咆。凡蚜。。
1吭从、怎么發(fā)布朝蜘?
Maven自帶deploy插件,我們無須在任何配置文件中配置涩金,但如果你想重載該配置谱醇,可以在pom.xml中更改默認(rèn)配置,這里不作過多說明步做,默認(rèn)配置就好副渴,其他的不用過多的關(guān)心,只要執(zhí)行以下命令就能幫我們上傳代碼全度,不過先別忙著執(zhí)行命令煮剧,接著往下看。
$ mvn clean deply
2、發(fā)布到哪兒去勉盅?
當(dāng)然是發(fā)布到中央庫去了啊佑颇,那怎么讓maven知道呢?下面是具體配置信息草娜,你也可以結(jié)合上面pom.xml整體看看挑胸。注意其中的 id 值,前面的篇幅也有提到過宰闰,這個(gè)值雖然是隨便定義的茬贵,但是必須和 settings.xml 中的server節(jié)點(diǎn) id 保持一致。
這兩個(gè)鏈接是死的议蟆,你可以直接復(fù)制過去,id的話不想改可以直接使用這個(gè)值萎战。
<distributionManagement>
<snapshotRepository>
<id>ossrh</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
</snapshotRepository>
<repository>
<id>ossrh</id>
<url>https://oss.sonatype.org/service/local/staging/deploy/maven2</url>
</repository>
</distributionManagement>
3咐容、以誰的名義發(fā)布?
就是你之前注冊(cè)的 issues.sonatype.org
賬號(hào)蚂维,這個(gè)需要讓maven知道戳粒,所以接下來需要對(duì)maven的配置文件進(jìn)行更改,路徑位于:/path/maven/conf/settings.xml
虫啥,在根節(jié)點(diǎn)下添加一個(gè) servers 節(jié)點(diǎn) id 隨意蔚约,記得和上面保持一致,然后就是你的賬號(hào)/密碼信息涂籽。
<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">
...
<servers>
<server>
<id>ossrh</id>
<username>tangxbai</username>
<password>***</password>
</server>
</servers>
...
</settings>
至此苹祟,Maven的相關(guān)配置完成。
5评雌、GPG簽名
用途說明
GPG詳細(xì)的解說請(qǐng)百度/Google查看更詳細(xì)的文檔树枫,Maven中使用主要在項(xiàng)目發(fā)布時(shí), 利用非對(duì)稱密鑰對(duì)來進(jìn)行簽名校對(duì)景东,以驗(yàn)證上傳者是否為你本人砂轻,不然誰都可以替你上傳甚至更改你的倉庫東西了?如果不是你本人那 只能上傳而無法正常發(fā)布到中央庫斤吐。
小插曲
那有人會(huì)說了搔涝,網(wǎng)上很多文章步驟都不是這樣的啊,關(guān)于GPG都放在前幾步的和措,你為什么放在后面來說呢庄呈?呃,因?yàn)榭犹嗯哨澹鹊耐卵阊鳎@也是我整個(gè)過程中遇到問題最多的一步,所以放在最后來說,當(dāng)然你也可以先準(zhǔn)備好你的GPG信息故响,以備不時(shí)之需傀广,反正早晚也會(huì)用到。如果你按照網(wǎng)上的步驟沒有任何問題的話彩届,那就注意一點(diǎn)就行了伪冰,怎么在其他電腦上使用同樣的信息進(jìn)行GPG簽名?樟蠕?贮聂?你有考慮過嗎?寨辩,如果沒有吓懈,那現(xiàn)在想一想。靡狞。耻警。
特別強(qiáng)調(diào)
GPG簽名作為中央庫校驗(yàn)應(yīng)用 很重要 的一個(gè)東西,一開始網(wǎng)上各種文章翻了個(gè)遍甸怕,都沒人說這東西的用處甘穿,都在盲目的教別人如何如何使用,一大堆無用的命令梢杭,混淆視聽温兼,甚至不說它在整個(gè)流程中的實(shí)際用處,是不是非要它不可武契?有它和沒它有什么區(qū)別募判?然后就盲目的踩坑測(cè)試,遇到各種各樣的問題咒唆,你可知道一整天研究這個(gè)兰伤,然后各種嘗試失敗又找不到解決方案的痛苦嗎?钧排?敦腔?直白的說,腦殼都摳破了恨溜,找不到人問符衔,身邊沒人知道,各種技術(shù)群里面一個(gè)個(gè)都水的無法言語糟袁,最后甚至嘗試了去掉這個(gè) 惡心 的步驟判族,直接打包上傳中央庫。项戴。形帮。
然鵝,我真的是太天真了,實(shí)際經(jīng)驗(yàn)告訴我辩撑,這TM根本就是必須的敖缧薄!:霞健各薇!我嘞個(gè)艸,網(wǎng)上文章簡(jiǎn)直不靠譜到天際君躺,暈死峭判!也沒人細(xì)說其中可能會(huì)遇到的問題。棕叫。林螃。唉,第一次真的很痛俺泣。疗认。。
記灼鲋汀:GPG在我們將項(xiàng)目發(fā)布到中央庫的過程中侮邀,是一個(gè)很重要的東西坏怪,不能省略贝润,所以不要像我一樣去嘗試省略這個(gè)步驟了,只會(huì)浪費(fèi)時(shí)間铝宵,不管遇到什么問題打掘,都要冷靜冷靜再冷靜,總是需要攻克這個(gè)難關(guān)的鹏秋。
安裝Gpg4win
https://gpg4win.org/thanks-for-download.html 這是下載地址尊蚁,有興趣的同學(xué)可以下載下來研究研究,這里關(guān)于此工具我不會(huì)作過多的說明侣夷,網(wǎng)上其他所有文章都是在這個(gè)的基礎(chǔ)上進(jìn)行的横朋,你也都跳不過這個(gè)工具,但實(shí)際證明這東西沒什么卵用百拓,而且網(wǎng)速慢的話還得等待它下載然后安裝琴锭,個(gè)人覺得浪費(fèi)時(shí)間,你如果想用這個(gè)東西衙传,請(qǐng)自行百度/Google决帖。。蓖捶。
Git/GPG
實(shí)際上我們的git程序 自帶gpg命令地回,這也就是我上面說為什么可以略過Gpg4win的一個(gè)原因,如果各位有疑慮的話,請(qǐng)打開你的 Git bash UI刻像,然后輸入 gpg --version
命令試試看會(huì)不會(huì)報(bào) gpg: command not found
畅买,如果沒有報(bào)錯(cuò)的話,那是應(yīng)該的绎速。皮获。。如果失敗的話纹冤,請(qǐng)檢查你的git版本是否太低洒宝,或者是不是太久沒有升級(jí)了,我也沒去研究過git到底是多少版本開始加入此命令的萌京,貌似從git 2.x以后都有這個(gè)命令雁歌,不過這里也有一個(gè)坑,后面會(huì)說到知残。靠瞎。。
在下使用的是win7系統(tǒng)求妹,git某目錄結(jié)果如下,需要確認(rèn)的同學(xué)請(qǐng)自行查看相關(guān)目錄父能,Mac系統(tǒng)的略過净神,我也不知道何吝,請(qǐng)自行探索。爱榕。坡慌。
提醒事項(xiàng)
如果你安裝了Gpg4win工具的話黔酥,程序會(huì)自動(dòng)在你的電腦添加一個(gè)環(huán)境變量,你可以在任何命令窗口直接執(zhí)行g(shù)pg命令洪橘,如果你和我一樣嫌麻煩沒有安裝,則必須在 Git bash UI 命令行依賴git而執(zhí)行坑夯,注意了抡四,各位同學(xué)仗谆。淑履。。
再有狸吞,在安裝了Gpg4win的前提下指煎,就不要在 git bash ui 命令行中執(zhí)行了,因?yàn)樵趃it的命令行中執(zhí)行使用的是git自帶的gpg程序至壤,而不是你安裝的程序。
基本命令
基本命令 | 備注說明 |
---|---|
gpg --gen-key | 生成密鑰 |
gpg --gen-revoke [ID] | 生成密鑰撤銷證書 |
gpg --armor --output [文件路徑] --export [ID] | 導(dǎo)出指定公鑰到指定文件 |
gpg --armor --output [文件路徑] --export-secret-keys [ID] | 導(dǎo)出指定私鑰鑰到指定文件 |
gpg --keyserver [服務(wù)器] --send-keys [ID] | 上傳到密鑰服務(wù)器 |
gpg --keyserver [服務(wù)器] --recv-keys [ID] | 檢測(cè)是否上傳成功(需要等待一兩分鐘才行) |
gpg --import [密鑰文件] | 導(dǎo)入你已有的密鑰到當(dāng)前電腦中 |
gpg --keyserver [服務(wù)器] --search-keys [ID] | 從服務(wù)器拉取指定ID的密鑰到當(dāng)前電腦 |
... | 其它更多命令自行百度/Google |
生成密鑰
$ gpg --gen-key
gpg (GnuPG) 2.2.17; Copyright (C) 2019 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Please select what kind of key you want:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
Your selection? 1 # 默認(rèn)選擇第1個(gè)就好了
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 2048 # 長(zhǎng)度越長(zhǎng)密鑰越安全,這里使用默認(rèn)長(zhǎng)度2048
Requested keysize is 2048 bits
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0) 0 # 密鑰過期時(shí)間镰绎,0永不過期,不常變更的話建議選擇0随静,永不過期
Key does not expire at all
Is this correct? (y/N) y # 輸入y
Key is valid for? (0) 0 # 輸入0
Key does not expire at all
Is this correct? (y/N) y # 輸入y
You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"
Real name: tangxbai
Email address: tangxbai@hotmail.com
Comment: com.viiyue.secrets # 備注信息選填
You selected this USER-ID:
"tangxbai (com.viiyue.secrets) <tangxbai@hotmail.com>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o # 需要更改請(qǐng)仔細(xì)閱讀驶臊,沒問題輸入 o
You need a Passphrase to protect your secret key.
passphrase: ***** # 輸入你的密鑰密碼挪挤,不要亂填叼丑,這個(gè)很重要关翎,后面也要用到
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
....+++++
+++++
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
....+++++
..+++++
gpg: /c/Users/Administrator/.gnupg/trustdb.gpg: trustdb created
gpg: key [ID] marked as ultimately trusted
public and secret key created and signed.
gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u
pub 2048R/[ID] 2019-10-14 # ID很重要啊,保管好它鸠信,很多地方需要用到它
Key fingerprint = *********
uid tangxbai (com.viiyue.secrets) <tangxbai@hotmail.com>
sub 2048R/[ID] 2019-10-14 # 這個(gè)ID沒有仔細(xì)研究過纵寝,有興趣的同學(xué)可以研究研究
至此星立,出現(xiàn)以上信息就代表密鑰已經(jīng)生成好了,這個(gè)步驟我嘗試了N多次室奏,基本不會(huì)出現(xiàn)什么問題劲装,有問題的同學(xué)可以私信在下昌简。
提醒事項(xiàng)
這里需要重點(diǎn)說明一個(gè)東西纯赎,這可是我經(jīng)歷若干步驟之后通過對(duì)比才發(fā)現(xiàn)的南蹂,也有可能你早就知道了,但是恕在下愚笨晚顷,網(wǎng)上就是沒有找到過關(guān)于此的任何文檔說明,其中的一個(gè)名叫 secring.gpg 的文件尤為重要音同,于是經(jīng)過多番資料查證秃嗜,它是你的私人 密鑰锅锨,用于提供文件簽名的很重要的一個(gè)文件,而它只有在第一次生成密鑰時(shí)才會(huì)產(chǎn)生必指,所以保管好它恕洲。
關(guān)于 secring.gpg 的說明
為什么我會(huì)說這個(gè) 私鑰 文件尤為重要呢霜第?因?yàn)橛辛怂悴拍茉?其他電腦 上發(fā)布你的項(xiàng)目,相信你也不想只在某一臺(tái)機(jī)器上操作吧癞谒,靈活一點(diǎn)刃榨,什么年代了,我們當(dāng)然需要 Coding everywhere 啊桌吃,如果缺少這個(gè)文件的話苞轿,執(zhí)行 mvn clean install
或者 mvn clean deploy
會(huì)出現(xiàn)以下錯(cuò)誤:
$ mvn clean install/deploy
...
# 隱約記得貌似是這樣的一個(gè)錯(cuò),懶得重試去截圖了让簿,將就看吧尔当。。锐帜。
gpg: no default secret key: No secret key
gpg: sign failed: No secret key
...
所以再次提醒一下各位畜号,保管好它。
導(dǎo)出密鑰
# 導(dǎo)出公鑰
$ gpg --armor --output public-key.txt --export [ID]
# 導(dǎo)出私鑰
$ gpg --armor --output private-key.txt --export-secret-keys [ID]
--armor
這個(gè)命令不加也可以蛮拔,加上是以ASCII明碼的形式保存建炫,否則是加密過的一串看不懂的東西疼蛾。
上傳到服務(wù)器
# 上傳到服務(wù)器,ID是你上面生成密鑰的ID
$ gpg --keyserver [key-server] --send-keys [ID]
# 檢測(cè)是否上傳成功(需要等待幾分鐘才會(huì)生效)
$ gpg --keyserver [key-server] --recv-keys [ID]
需要注意的是衍慎,maven中央庫為了驗(yàn)證文件簽名稳捆,提供了多個(gè)簽名服務(wù)器供我們使用鳞芙,它會(huì)嘗試從每臺(tái)服務(wù)器拉取你的公鑰然后說文件做對(duì)比期虾,但是我們上傳了密鑰信息之后镶苞,需要等待很長(zhǎng)一段時(shí)間,它才會(huì)將你的信息同步到其他密鑰服務(wù)器上壕鹉,這個(gè)過程很漫長(zhǎng),反正我等待了好幾個(gè)小時(shí)都沒搞定了负乡,可能同步程序只會(huì)在特定時(shí)間激活吧脊凰,所以我們就不要瞎等了,可以手動(dòng)將信息推送到各個(gè)服務(wù)器上切省,這樣就縮短了等待時(shí)間帕胆,值得注意的是懒豹,很多服務(wù)器貌似是國外網(wǎng)站,能訪問何陆,但速度很慢豹储,還是需要等待幾分鐘剥扣。
公鑰服務(wù)器列表
這里我整理了一份可能會(huì)涉及的服務(wù)器列表,各位同學(xué)可以手動(dòng)上傳到這些服務(wù)器上佳魔,命令就用上面的上傳命令就行晦炊。
- hkp://pool.sks-keyservers.net
- hkp://keyserver.ubuntu.com
- hkp://subkeys.pgp.net
- hkp://pgp.mit.edu
- hkp://www.gpg-keyserver.de
算了断国,我還是貼一份吧。霞捡。薄疚。分開執(zhí)行,不要全部一起執(zhí)行砰碴,待成功之后再執(zhí)行下一個(gè)呈枉,成功信息不就不貼了,有點(diǎn)認(rèn)知的話都大概知道輸出什么信息代表成功吧弱卡?
$ gpg --keyserver hkp://pool.sks-keyservers.net --send-keys [ID]
$ gpg --keyserver hkp://keyserver.ubuntu.com --send-keys [ID]
$ gpg --keyserver hkp://subkeys.pgp.net --send-keys [ID]
$ gpg --keyserver hkp://pgp.mit.edu --send-keys [ID]
$ gpg --keyserver hkp://www.gpg-keyserver.de --send-keys [ID]
提醒事項(xiàng)
上傳密鑰文件到服務(wù)器這個(gè)步驟也是必須的住册,包括保證它必須能被檢測(cè)到荧飞!因?yàn)樯蟼鞯絤aven中央庫暫存區(qū)之后,正式發(fā)布時(shí)平臺(tái)會(huì)從密鑰服務(wù)器拉取對(duì)應(yīng) ID 的公鑰文件來校驗(yàn)?zāi)愕捻?xiàng)目文件簽名是否正確挠轴,否則中央庫會(huì)報(bào) No public secret key
的一個(gè)錯(cuò)誤耳幢,所以盡量保證你的密鑰能夠上傳成功睛藻,如果網(wǎng)絡(luò)出錯(cuò)的話,建議多嘗試幾次冈在。
哦按摘,對(duì)了,這里還得廢話的說一下pom.xml文件中如果缺少GPG插件會(huì)出現(xiàn)的問題溅固,當(dāng)我們上傳成功后照激,興高采烈的在中央庫暫存區(qū)中點(diǎn)擊項(xiàng)目Close時(shí)俩垃,平臺(tái)會(huì)無情的報(bào) Missing signature
的一個(gè)錯(cuò),也就是你的項(xiàng)目缺少簽名信息苹粟,網(wǎng)上搜羅了很久未果跃闹,最后回想了一下望艺,可能這個(gè)插件是必須的。艇劫。惩激。最后通過驗(yàn)證风钻,確實(shí)如此。
其他電腦使用GPG
這個(gè)問題也是搜羅了很久很久鸣个,不過最后還是解決了布朦,值得鼓勵(lì)喝滞。兩種方式,一種是將你上面導(dǎo)出來的密鑰文件通過命令的方式導(dǎo)入到電腦做盅,另一種是從服務(wù)器拉取窘哈。
# 直接導(dǎo)入密鑰文件
$ gpg --import [密鑰文件]
# 從服務(wù)器拉取滚婉,服務(wù)器請(qǐng)參考上面羅列的服務(wù)器列表
$ gpg --keyserver [key-server] --search-keys [ID]
gpg-agent
這個(gè)命令這里不會(huì)用到,主要是執(zhí)行maven項(xiàng)目打包或者上傳時(shí)gpg簽名可能會(huì)出現(xiàn)的問題远剩,具體錯(cuò)誤記不太清楚了,反正大致意思就是需要運(yùn)行一下這個(gè)命令锥余,低版本的git中可能沒有這個(gè)工具驱犹,需要升級(jí)到最新版的git程序足画,簡(jiǎn)單運(yùn)行一下就行了。
# 檢測(cè)是否有此命令
$ gpg-agent --version
# 運(yùn)行此命令
$ gpg-agent
至此医舆,GPG的使用和注意事項(xiàng)也就差不多了彬向。
6攻冷、上傳項(xiàng)目
這個(gè)步驟沒有什么值得過多說明,唯一需要保證的就是你的項(xiàng)目普通打包安裝沒有任何問題里烦。胁黑。州泊。
執(zhí)行命令
$ mvn clean deploy
...
Uploaded: https://oss.sonatype.org/content/repositories/snapshots/com/viiyue/plugins/mybatis-mapper/1.1.0/mybatis-mapper-1.1.0-sources.jar.asc (499 B at 1.2 KB/sec)
Uploading: https://oss.sonatype.org/content/repositories/snapshots/com/viiyue/plugins/mybatis-mapper/maven-metadata.xml
Uploaded: https://oss.sonatype.org/content/repositories/snapshots/com/viiyue/plugins/mybatis-mapper/maven-metadata.xml (2 KB at 1.5 KB/sec)
Uploading: https://oss.sonatype.org/content/repositories/com/viiyue/plugins/mybatis-mapper/1.1.0/mybatis-mapper-1.1.0-javadoc.jar.asc
Uploaded: https://oss.sonatype.org/content/repositories/snapshots/com/viiyue/plugins/mybatis-mapper/1.1.0/mybatis-mapper-1.1.0-javadoc.jar.asc (499 B at 1.2 KB/sec)
Uploading: https://oss.sonatype.org/content/repositories/com/viiyue/plugins/mybatis-mapper/maven-metadata.xml
Uploaded: https://oss.sonatype.org/content/repositories/snapshots/com/viiyue/plugins/mybatis-mapper/maven-metadata.xml (2 KB at 1.1 KB/sec)
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 52.229 s
[INFO] Finished at: 2018-07-14T22:14:28+08:00
[INFO] Final Memory: 25M/297M
[INFO] ------------------------------------------------------------------------
結(jié)果分析
當(dāng)你執(zhí)行命令得到以上結(jié)果遥皂,那么恭喜你演训,你已經(jīng)成功80%了,即將站上人生頂峰拂募,走向迎接白富美/高富帥的道路,開玩笑蔼水,扯遠(yuǎn)了爬凑。嘁信。疏叨。
7蚤蔓、回到maven管理平臺(tái)
如果你還不知道管理平臺(tái)的地址,那么在下不辭辛勞的為您再貼一遍吧单寂。吐辙。昏苏。
- https://issues.sonatype.org - 問題管理系統(tǒng),你注冊(cè)賬號(hào)的那個(gè)系統(tǒng)
- https://oss.sonatype.org/ - 中央倉庫管理平臺(tái)
登錄管理平臺(tái)洼专,賬號(hào)/密碼就是你當(dāng)初注冊(cè)的那個(gè)賬號(hào)屁商。
發(fā)布項(xiàng)目
進(jìn)入主頁面之后颈墅,進(jìn)入 Staging Repositories 暫存區(qū),如果你的項(xiàng)目沒有設(shè)置發(fā)布插件的話帽哑,則會(huì)進(jìn)入到這里妻枕,找到你要操作的項(xiàng)目,選中它述么,你會(huì)發(fā)現(xiàn)上方的 Close 按鈕亮起愕掏,當(dāng)你確認(rèn)上傳無誤之后饵撑,你可以點(diǎn)擊 Close 按鈕,關(guān)閉掉這個(gè)倉庫垢乙,不允許再次上傳语卤。如果關(guān)閉成功粹舵,點(diǎn)擊 Refresh 以后會(huì)你會(huì)發(fā)現(xiàn) Release 按鈕亮起,點(diǎn)擊它即可發(fā)布巴席。如果關(guān)閉失敗情妖,你可以看看下方的界面诱担,查找一下失敗原因,再次上傳代碼料睛,關(guān)閉后發(fā)布恤煞。
如果你有仔細(xì)閱讀我上面的 廢話 的話施籍,這里應(yīng)該能順利并且發(fā)行你的項(xiàng)目丑慎。
可能會(huì)出現(xiàn)以下問題
# 現(xiàn)象一,缺少GPG文件簽名玉吁,老老實(shí)實(shí)配置好你的GPG吧进副,唉。给赞。塞俱。
Missing signature
# 現(xiàn)象二吏垮,未在任何公鑰服務(wù)器找到你的公鑰
No public key: Key with id: (XXXXX) was not able to be located (oss.sonatype.org)
關(guān)于第二點(diǎn)膳汪,你可以參考以下下網(wǎng)站:
關(guān)于這種情況我上面也已經(jīng)說了九秀,要么你沒有將你的公鑰上傳到服務(wù)器鼓蜒,要么服務(wù)器還未完全同步你的公鑰信息,為了縮短這個(gè)同步過程娇豫,你可以分別將公鑰信息手動(dòng)上傳到多個(gè)服務(wù)器冯痢,關(guān)于此框杜,請(qǐng)回退到上面 GPG簽名 再看看咪辱。
至此,整個(gè)過程中所有我遇到過的問題都以 廢話 的形式羅列了出來店枣,希望各位同學(xué)不要再遇到這些問題了招刨,如果遇到這些問題也不要緊張,希望此文能幫到你哮洽。
何時(shí)能生效?
當(dāng)你點(diǎn)擊完 Release 之后氛什,記得回去你的問題管理系統(tǒng)( https://issues.sonatype.org )回復(fù)一下你已經(jīng)發(fā)行了你的第一個(gè)項(xiàng)目枪眉,從審核通過后開始算的話再层,大概間隔幾分鐘到一個(gè)小時(shí)之后在Central( https://search.maven.org/ )中就可以搜到了聂受,但這只是一部分網(wǎng)站能搜到,像我們平時(shí)使用的阿里云Maven私服(http://maven.aliyun.com)和常用的Maven庫( https://mvnrepository.com/ )則需要等待一到兩天才會(huì)生效棍鳖。實(shí)測(cè)應(yīng)該不會(huì)超過一天渡处。
8祟辟、最后
至此医瘫,如果你到了這里,那就恭喜各位同學(xué)川尖,你擁有了自己的第一個(gè)公開的可隨處使用的項(xiàng)目登下,凡事開頭難,第一次難免各種痛苦叮喳,以后就好了被芳,在同一個(gè) Group Id 下發(fā)布的任何項(xiàng)目都不需要這么麻煩了馍悟,直接執(zhí)行 deploy 即可畔濒,然后等一到兩天各大中央庫就會(huì)同步生效了。
雖然篇幅廢話和文字比較多锣咒,但如果有幫助到你侵状,那我很高興赞弥,如果您覺得對(duì)您有任何幫助,可以點(diǎn)個(gè)贊或者分享給有需要的小伙伴趣兄。