發(fā)布項(xiàng)目到Maven中央庫

前言

此次將自己的項(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é)參考顿天。

image

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ā)布了。

image

小提示:如何驗(yàn)證自己的TXT記錄已經(jīng)生效了呢表锻?見下圖恕齐,如果有這樣的結(jié)果就說明記錄生效了

校驗(yàn)教程

6、等待審核

審核通過后平臺(tái)會(huì)告訴你結(jié)果瞬逊,如果沒有通過显歧,修改后填寫備注信息再次提交等待審核即可补胚,通過后大概如下,意思就是已經(jīng)為我們準(zhǔn)備好了相關(guān)信息追迟,可以正常發(fā)布項(xiàng)目了。

image

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)目都不需要這些流程了。

審核結(jié)果

至此契沫,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)自行探索。爱榕。坡慌。

GIT-GPG

提醒事項(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)生必指,所以保管好它恕洲。

image

關(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ù)器上佳魔,命令就用上面的上傳命令就行晦炊。

算了断国,我還是貼一份吧。霞捡。薄疚。分開執(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)的地址,那么在下不辭辛勞的為您再貼一遍吧单寂。吐辙。昏苏。

登錄管理平臺(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)目丑慎。

image

可能會(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)站:

https://stackoverflow.com/questions/19462617/no-public-key-key-with-id-xxxxx-was-not-able-to-be-located-oss-sonatype-org

關(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è)贊或者分享給有需要的小伙伴趣兄。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绽左,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子艇潭,更是在濱河造成了極大的恐慌拼窥,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,002評(píng)論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蹋凝,死亡現(xiàn)場(chǎng)離奇詭異鲁纠,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)鳍寂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門改含,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人迄汛,你說我怎么就攤上這事捍壤。” “怎么了隔心?”我有些...
    開封第一講書人閱讀 169,787評(píng)論 0 365
  • 文/不壞的土叔 我叫張陵白群,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我硬霍,道長(zhǎng),這世上最難降的妖魔是什么笼裳? 我笑而不...
    開封第一講書人閱讀 60,237評(píng)論 1 300
  • 正文 為了忘掉前任唯卖,我火速辦了婚禮,結(jié)果婚禮上躬柬,老公的妹妹穿的比我還像新娘拜轨。我一直安慰自己,他們只是感情好允青,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,237評(píng)論 6 398
  • 文/花漫 我一把揭開白布橄碾。 她就那樣靜靜地躺著,像睡著了一般颠锉。 火紅的嫁衣襯著肌膚如雪法牲。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,821評(píng)論 1 314
  • 那天琼掠,我揣著相機(jī)與錄音拒垃,去河邊找鬼。 笑死瓷蛙,一個(gè)胖子當(dāng)著我的面吹牛悼瓮,可吹牛的內(nèi)容都是我干的戈毒。 我是一名探鬼主播,決...
    沈念sama閱讀 41,236評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼横堡,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼埋市!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起命贴,我...
    開封第一講書人閱讀 40,196評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤恐疲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后套么,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體培己,經(jīng)...
    沈念sama閱讀 46,716評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,794評(píng)論 3 343
  • 正文 我和宋清朗相戀三年胚泌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了省咨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,928評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡玷室,死狀恐怖零蓉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情穷缤,我是刑警寧澤敌蜂,帶...
    沈念sama閱讀 36,583評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站津肛,受9級(jí)特大地震影響章喉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜身坐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,264評(píng)論 3 336
  • 文/蒙蒙 一秸脱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧部蛇,春花似錦摊唇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至抹腿,卻和暖如春岛请,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背幢踏。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評(píng)論 1 274
  • 我被黑心中介騙來泰國打工髓需, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人房蝉。 一個(gè)月前我還...
    沈念sama閱讀 49,378評(píng)論 3 379
  • 正文 我出身青樓僚匆,卻偏偏與公主長(zhǎng)得像微渠,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子咧擂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,937評(píng)論 2 361

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