一般间坐,我們?nèi)绻_發(fā)了一個工具組件灾挨,肯定想將它發(fā)布以供其他人使用。在公司內(nèi)部竹宋,我們可以將其發(fā)布到私有倉庫劳澄,在互聯(lián)網(wǎng)環(huán)境,我們一般將其發(fā)布到 maven 中央倉庫蜈七。以下以我們最近開發(fā)的java工具 flyRafter
進行介紹秒拔,如何將一個組件發(fā)布到 maven 中央倉庫。
首先飒硅,我們先要確保組件能正確編譯為 jar 包砂缩,在這個前提下,我們先提前配置我們項目的 pom.xml
三娩,以便發(fā)布時使用庵芭。
- 項目基本信息配置
<groupId>fun.mortnon</groupId>
<artifactId>flyrafter</artifactId>
<version>0.0.1</version>
<packaging>jar</packaging>
<name>${project.artifactId}</name>
<url>https://gitee.com/mortise-and-tenon/flyrafter</url>
<description>generate sql file from java entity class.</description>
這里配置項目的最重要的 groupId
、artifactId
尽棕、name
等。
需要注意彬伦,按照中央庫的要求滔悉,如果向 maven 中央庫提交組件,你需要擁有
groupId
使用的域名单绑,如果你沒有域名回官,你也可以使用托管環(huán)境的域名作為groupId
。比如你項目在 github上搂橙,你的用戶名叫 ME歉提,你的groupId
可以是com.github.me
。
- 組件的開源協(xié)議
<licenses>
<license>
<name>MIT License</name>
<url>https://opensource.org/licenses/MIT</url>
<distribution>repo</distribution>
</license>
</licenses>
你用什么協(xié)議区转,就配置相應(yīng)協(xié)議即可苔巨。
- 項目的源碼地址及所屬開發(fā)者信息
<scm>
<url>http://mortnon.fun</url>
<connection>scm:git:https://gitee.com/mortise-and-tenon/flyrafter.git</connection>
<developerConnection>scm:git:https://gitee.com/mortise-and-tenon/flyrafter.git</developerConnection>
</scm>
<developers>
<developer>
<name>mortnon</name>
<email>mortnon@outlook.com</email>
<organization>卯榫 mortise-and-tenon</organization>
<organizationUrl>https://mortnon.fun</organizationUrl>
</developer>
</developers>
在這里填寫你的項目地址、托管的SCM地址废离,以及所屬開發(fā)者的介紹信息侄泽。
- 發(fā)布倉庫配置
<distributionManagement>
<snapshotRepository>
<id>ossrh</id>
<url>https://s01.oss.sonatype.org/content/repositories/snapshots</url>
</snapshotRepository>
<repository>
<id>ossrh</id> <url>https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/</url>
</repository>
</distributionManagement>
這里配置的倉庫地址,是中央庫最新的地址蜻韭,新項目都將提交到這里悼尾。
注意
id
值 ossrh柿扣,這個值要與后面在本地 maven 的setting.xml
配置的 值一致,保持與官方說明使用的 ossrh 一致最簡單闺魏。
- 插件配置
<build>
<plugins>
<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
<version>1.6.7</version>
<extensions>true</extensions>
<configuration>
<serverId>ossrh</serverId>
<nexusUrl>https://s01.oss.sonatype.org/</nexusUrl>
<autoReleaseAfterClose>true</autoReleaseAfterClose>
</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>
<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>
<additionalJOptions>
<additionalJOption>-Xdoclint:none</additionalJOption>
</additionalJOptions>
</configuration>
</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>
</execution>
</executions>
</plugin>
</plugins>
</build>
以上插件是發(fā)布到中央庫所需要的未状,與項目本身編譯沒有直接關(guān)系。由于涉及到 source析桥、doc的編譯生成司草,如果只是本地調(diào)試,會增加編譯耗時烹骨,所以官方也建議將這些與發(fā)布相關(guān)的插件通過 profile進行區(qū)分配置翻伺,將這些發(fā)布相關(guān)插件放到發(fā)布的 profile中,如:
<profiles>
...
<profile>
<id>release</id>
<build>
<plugins>
...
</plugins>
</build>
</profile>
</profiles>
以上為對項目的 pom.xml
進行配置的介紹沮焕。以下介紹對本地 maven 的 setting.xml
進行配置介紹吨岭。打開本地 maven 工具的目錄,進入 conf
目錄下峦树,就可以看到 setting.xml
文件辣辫。打開此文件,按如下添加內(nèi)容:
- 向
profiles
節(jié)點添加內(nèi)容
<profile>
<id>ossrh</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<gpg.executable>gpg</gpg.executable>
<gpg.passphrase>the_pass_phrase</gpg.passphrase>
</properties>
</profile>
注意這里的
gpg
是在發(fā)布時調(diào)的命令魁巩,根據(jù)gpg的版本急灭,這里也可以是gpg2
,而passphrase
代表你的私鑰的密碼谷遂,這里可不用填寫葬馋,在發(fā)布時,一般還會彈窗要求輸入肾扰。
- 向
servers
節(jié)點添加內(nèi)容
<server>
<id>ossrh</id>
<username>NAME</username>
<password>PWD</password>
</server>
注意這里的用戶名和密碼畴嘶,是中央庫 sonatype 的用戶名與密碼,后面將介紹相關(guān)的使用集晚,注冊地址為 sonatype
以上發(fā)布插件窗悯、maven setting.xml
中都涉及gpg配置,因為項目編譯后發(fā)布前要使用gpg進行簽名校驗偷拔,所以我們需要先用這個工具生成公私鑰蒋院。Linux 環(huán)境下這個工具很簡單,此處不討論莲绰,僅討論 Windows 環(huán)境下欺旧。
我們先去gpg4win 官方下載 Windows 環(huán)境的安裝包,地址:gpg4win蛤签。下載頁面上切端,會讓你選擇是否使用 paypal 捐助,沒錢選擇捐 0 元顷啼,直接下載即可踏枣。下載成功后昌屉,雙擊安裝程序,按提示不斷下一步安裝即可茵瀑。
安裝成功后间驮,打開gpg4win(名為Kleopatra,圖標頭像是一個齊留海的女頭)马昨,如果出現(xiàn)如下提示信息 “Kleopatra cannot be run as administrator without breaking file permissions in the GnuPG data folder.”竞帽。遇到這種情況,可以直接點擊另一個安裝時生成的快捷圖標 GPA
來打開gpg應(yīng)用鸿捧,然后點擊圖標中靠右的 Keyring
來打開生成界面屹篓。
在GPA界面中點擊生成新的密鑰,按照提示一步步操作即可匙奴,注意記住自己的密鑰的密碼堆巧。密鑰生成成功后,右鍵點擊密鑰泼菌,然后選擇“Send Keys”谍肤,將公鑰發(fā)送給服務(wù)器。
以上所有配置哗伯、操作完成后荒揣,本地的配置基本完成。以下進入 sonatype 進行賬號注冊焊刹。
進入官網(wǎng)sonatype系任,注冊一個賬號,注意密碼要有大小寫和特殊符號虐块。注冊成功后俩滥,點擊上方的“新建”,然后新建一個問題(issue),選擇項目Community Support - Open Source Project Repository Hosting (OSSRH)
非凌,問題類型選擇 New Project
举农。
概要
輸入自己的項目名稱或者相應(yīng)的描述即可荆针。Group Id
輸入自己項目的Group Id敞嗡,注意上面提過的規(guī)則(要么用自己的域名,要么用托管網(wǎng)站的域名航背,官方文檔Group Id)喉悴。Project URL
輸入自己的項目網(wǎng)站地址SCM url
輸入項目的git下載地址其他項保持默認為空,即可
最后玖媚,點擊新建箕肃,提交問題今魔,然后等待官方回復操作指南障贸。
官方會提示吟宦,你確認是否擁有相應(yīng)域名所有權(quán)篮洁,只要在域名的DNS解析中,添加一條txt記錄殃姓,將內(nèi)容填寫為自己的問題單url即可,如果是托管網(wǎng)站的名字蜗侈,如com.github.xxx,官方會直接檢查踏幻。
當DNS解析添加后馁害,點擊備注专肪,添加一條備注,告訴已添加dns解析即可搀愧。
官方審核后佳晶,會給出上傳組件的指導手冊抄瓦,手冊中會指導如何在pom.xml
中添加配置蚕泽,也就是我們上面介紹的配置。在此仔蝌,我們就去進行發(fā)布即可,可以先回到上面的setting.xml
中添加自己的 sonatype 賬號和密碼敛惊。
在本地的命令行中對項目執(zhí)行mvn發(fā)布命令 mvn clean deploy
即可在編譯成功后绰更,并將組件發(fā)布到中央庫 stage 庫中。同時儡湾,如果 artifact id 不以 -SNAPSHOT
結(jié)尾的話,mvn 的 stage 插件會自動將stage 庫的組件正式發(fā)布到公開倉庫中徐钠。
需要注意,如果
pom.xml
使用了 profile 對開發(fā)显拜、發(fā)布進行了區(qū)分,發(fā)布命令中需要帶上指定的 profile 名稱远荠,如mvn clean deploy -Prelease
,而更多的參數(shù)可以按照 mvn 命令的說明進行添加
發(fā)布后乏屯,我們可以在倉庫中搜索發(fā)布的組件,地址:Nexus Repository Manager辰晕,并且,如果組件處于 stage 庫确虱,可以在這里管理含友。官方也提示,發(fā)布后可以直接在[倉庫](Central Repository: (maven.org))中查看校辩,但要在Maven Central Repository Search查看的話窘问,需要等2小時宜咒。
以上,就是整個組件向中央庫發(fā)布的操作過程故黑。以上示例中,我們發(fā)布了最后開發(fā)的 flyRafter
第一個預覽版混埠,這個工具是用于 java 中將 @Entity 注解的實體類自動生成建表 SQL 文件的工具诗轻,同時,它結(jié)合 flyway 使用吏颖,可以達成效果:
不用單獨寫sql定義表鞠柄,只要建好數(shù)據(jù)庫嫉柴,在實體類中定義好字段名稱和定義,就可以動態(tài)的對數(shù)據(jù)庫表進行變化,類似于 Hibernate的
ddl-auto:update
瞧壮,但比它更好用匙握。
gitee地址: FlyRafter: 實體轉(zhuǎn)為SQL,并結(jié)合flyway應(yīng)用的工具 (gitee.com)圈纺,maven 地址:Maven FlyRafter該工具正在完善中,歡迎大家試用灯谣,并提交 issue蛔琅。