常用jar包_发布Maven包的正确姿势
本文介紹如何把自己寫的Maven包發布到公開倉庫/中央倉庫/私有倉庫。
當我們使用commons-logging這些第三方開源庫的時候,我們實際上是通過Maven自動下載它的jar包,并根據其pom.xml解析依賴,自動把相關依賴包都下載后加入到classpath。
那么問題來了:當我們自己寫了一個牛逼的開源庫時,非常希望別人也能使用,總不能直接放個jar包的鏈接讓別人下載吧?
如果我們把自己的開源庫放到Maven的repo中,那么,別人只需按標準引用groupId:artifactId:version,即可自動下載jar包以及相關依賴。因此,本節我們介紹如何發布一個庫到Maven的repo中。
把自己的庫發布到Maven的repo中有好幾種方法,我們介紹3種最常用的方法。
以靜態文件發布
如果我們觀察一個中央倉庫的Artifact結構,例如Commons Math,它的groupId是org.apache.commons,artifactId是commons-math3,以版本3.6.1為例,發布在中央倉庫的文件夾路徑就是https://repo1.maven.org/maven2/org/apache/commons/commons-math3/3.6.1/,在此文件夾下,commons-math3-3.6.1.jar就是發布的jar包,commons-math3-3.6.1.pom就是它的pom.xml描述文件,commons-math3-3.6.1-sources.jar是源代碼,commons-math3-3.6.1-javadoc.jar是文檔。其它以.asc、.md5、.sha1結尾的文件分別是GPG簽名、MD5摘要和SHA-1摘要。
我們只要按照這種目錄結構組織文件,它就是一個有效的Maven倉庫。
我們以廣受好評的開源項目how-to-become-rich為例,先創建Maven工程目錄結構如下:
how-to-become-rich ├── maven-repo <-- Maven本地文件倉庫 ├── pom.xml <-- 項目文件 ├── src │ ├── main │ │ ├── java <-- 源碼目錄 │ │ └── resources <-- 資源目錄 │ └── test │ ├── java <-- 測試源碼目錄 │ └── resources <-- 測試資源目錄 └── target <-- 編譯輸出目錄在pom.xml中添加如下內容:
<project ...>...<distributionManagement><repository><id>local-repo-release</id><name>GitHub Release</name><url>file://${project.basedir}/maven-repo</url></repository></distributionManagement><build><plugins><plugin><artifactId>maven-source-plugin</artifactId><executions><execution><id>attach-sources</id><phase>package</phase><goals><goal>jar-no-fork</goal></goals></execution></executions></plugin><plugin><artifactId>maven-javadoc-plugin</artifactId><executions><execution><id>attach-javadocs</id><phase>package</phase><goals><goal>jar</goal></goals></execution></executions></plugin></plugins></build> </project>注意到<distributionManagement>,它指示了發布的軟件包的位置,這里的<url>是項目根目錄下的maven-repo目錄,在<build>中定義的兩個插件maven-source-plugin和maven-javadoc-plugin分別用來創建源碼和javadoc,如果不想發布源碼,可以把對應的插件去掉。
我們直接在項目根目錄下運行Maven命令mvn clean package deploy,如果一切順利,我們就可以在maven-repo目錄下找到部署后的所有文件如下:
maven-repo └── com└── itranswarp└── rich└── how-to-become-rich├── 1.0.0│ ├── how-to-become-rich-1.0.0-javadoc.jar│ ├── how-to-become-rich-1.0.0-javadoc.jar.md5│ ├── how-to-become-rich-1.0.0-javadoc.jar.sha1│ ├── how-to-become-rich-1.0.0-sources.jar│ ├── how-to-become-rich-1.0.0-sources.jar.md5│ ├── how-to-become-rich-1.0.0-sources.jar.sha1│ ├── how-to-become-rich-1.0.0.jar│ ├── how-to-become-rich-1.0.0.jar.md5│ ├── how-to-become-rich-1.0.0.jar.sha1│ ├── how-to-become-rich-1.0.0.pom│ ├── how-to-become-rich-1.0.0.pom.md5│ └── how-to-become-rich-1.0.0.pom.sha1├── maven-metadata.xml├── maven-metadata.xml.md5└── maven-metadata.xml.sha1最后一步,是把這個工程推到GitHub上,并選擇Settings-GitHub Pages,選擇master branch啟用Pages服務:
這樣,把全部內容推送至GitHub后,即可作為靜態網站訪問Maven的repo,它的地址是https://michaelliao.github.io/how-to-become-rich/maven-repo/。版本1.0.0對應的jar包地址是:
https://michaelliao.github.io/how-to-become-rich/maven-repo/com/itranswarp/rich/how-to-become-rich/1.0.0/how-to-become-rich-1.0.0.jar
現在,如果其他人希望引用這個Maven包,我們可以告知如下依賴即可:
<dependency><groupId>com.itranswarp.rich</groupId><artifactId>how-to-become-rich</artifactId><version>1.0.0</version> </dependency>但是,除了正常導入依賴外,對方還需要再添加一個<repository>的聲明,即使用方完整的pom.xml如下:
<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>example</groupId><artifactId>how-to-become-rich-usage</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target><java.version>11</java.version></properties><repositories><repository><id>github-rich-repo</id><name>The Maven Repository on Github</name><url>https://michaelliao.github.io/how-to-become-rich/maven-repo/</url></repository></repositories><dependencies><dependency><groupId>com.itranswarp.rich</groupId><artifactId>how-to-become-rich</artifactId><version>1.0.0</version></dependency></dependencies> </project>在<repository>中,我們必須聲明發布的Maven的repo地址,其中<id>和<name>可以任意填寫,<url>填入GitHub Pages提供的地址+/maven-repo/后綴。現在,即可正常引用這個庫并編寫代碼如下:
Millionaire millionaire = new Millionaire(); System.out.println(millionaire.howToBecomeRich());有的童鞋會問,為什么使用commons-logging等第三方庫時,并不需要聲明repo地址?這是因為這些庫都是發布到Maven中央倉庫的,發布到中央倉庫后,不需要告訴Maven倉庫地址,因為它知道中央倉庫的地址默認是https://repo1.maven.org/maven2/,也可以通過~/.m2/settings.xml指定一個代理倉庫地址以替代中央倉庫來提高速度(參考依賴管理的Maven鏡像)。
因為GitHub Pages并不會把我們發布的Maven包同步到中央倉庫,所以自然使用方必須手動添加一個我們提供的倉庫地址。
此外,通過GitHub Pages發布Maven repo時需要注意一點,即不要改動已發布的版本。因為Maven的倉庫是不允許修改任何版本的,對一個庫進行修改的唯一方法是發布一個新版本。但是通過靜態文件的方式發布repo,實際上我們是可以修改jar文件的,但最好遵守規范,不要修改已發布版本。
通過Nexus發布到中央倉庫
有的童鞋會問,能不能把自己的開源庫發布到Maven的中央倉庫,這樣用戶就不需要聲明repo地址,可以直接引用,顯得更專(裝)業(逼)。
當然可以,但我們不能直接發布到Maven中央倉庫,而是通過曲線救國的方式,發布到central.sonatype.org,它會定期自動同步到Maven的中央倉庫。Nexus是一個支持Maven倉庫的軟件,由Sonatype開發,有免費版和專業版兩個版本,很多大公司內部都使用Nexus作為自己的私有Maven倉庫,而這個central.sonatype.org相當于面向開源的一個Nexus公共服務。
所以,第一步是在central.sonatype.org上注冊一個賬號,注冊鏈接非常隱蔽,可以自己先找找,找半小時沒找到點這里查看。
如果注冊順利并審核通過,會得到一個登錄賬號,然后,通過這個頁面一步一步操作就可以成功地將自己的Artifact發布到Nexus上,再耐心等待幾個小時后,你的Artifact就會出現在Maven的中央倉庫中。
這里簡單提一下發布重點與難點:
- 必須正確創建GPG簽名,Linux和Mac下推薦使用gnupg2;
- 必須在~/.m2/settings.xml中配置好登錄用戶名和口令,以及GPG口令:
在待發布的Artifact的pom.xml中添加OSS的Maven repo地址,以及maven-jar-plugin、maven-source-plugin、maven-javadoc-plugin、maven-gpg-plugin、nexus-staging-maven-plugin:
<project ...>...<distributionManagement><snapshotRepository><id>ossrh</id><url>https://oss.sonatype.org/content/repositories/snapshots</url></snapshotRepository><repository><id>ossrh</id><name>Nexus Release Repository</name><url>http://oss.sonatype.org/service/local/staging/deploy/maven2/</url></repository></distributionManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><executions><execution><goals><goal>jar</goal><goal>test-jar</goal></goals></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-source-plugin</artifactId><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><executions><execution><id>attach-javadocs</id><goals><goal>jar</goal></goals><configuration><additionalOption><additionalOption>-Xdoclint:none</additionalOption></additionalOption></configuration></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-gpg-plugin</artifactId><executions><execution><id>sign-artifacts</id><phase>verify</phase><goals><goal>sign</goal></goals></execution></executions></plugin><plugin><groupId>org.sonatype.plugins</groupId><artifactId>nexus-staging-maven-plugin</artifactId><version>1.6.3</version><extensions>true</extensions><configuration><serverId>ossrh</serverId><nexusUrl>https://oss.sonatype.org/</nexusUrl><autoReleaseAfterClose>true</autoReleaseAfterClose></configuration></plugin></plugins></build> </project>最后執行命令mvn clean package deploy即可發布至central.sonatype.org。
此方法前期需要復雜的申請賬號和項目的流程,后期需要安裝調試GPG,但只要跑通流程,后續發布都只需要一行命令。
發布到私有倉庫
通過nexus-staging-maven-plugin除了可以發布到central.sonatype.org外,也可以發布到私有倉庫,例如,公司內部自己搭建的Nexus服務器。
如果沒有私有Nexus服務器,還可以發布到GitHub Packages。GitHub Packages是GitHub提供的倉庫服務,支持Maven、NPM、Docker等。使用GitHub Packages時,無論是發布Artifact,還是引用已發布的Artifact,都需要明確的授權Token,因此,GitHub Packages只能作為私有倉庫使用。
在發布前,我們必須首先登錄后在用戶的Settings-Developer settings-Personal access tokens中創建兩個Token,一個用于發布,一個用于使用。發布Artifact的Token必須有repo、write:packages和read:packages權限:
使用Artifact的Token只需要read:packages權限。
在發布端,把GitHub的用戶名和發布Token寫入~/.m2/settings.xml配置中:
<settings ...>...<servers><server><id>github-release</id><username>GITHUB-USERNAME</username><password>f052...c21f</password></server></servers> </settings>然后,在需要發布的Artifact的pom.xml中,添加一個<repository>聲明:
<project ...>...<distributionManagement><repository><id>github-release</id><name>GitHub Release</name><url>https://maven.pkg.github.com/michaelliao/complex</url></repository></distributionManagement> </project>注意到<id>和~/.m2/settings.xml配置中的<id>要保持一致,因為發布時Maven根據id找到用于登錄的用戶名和Token,才能成功上傳文件到GitHub。我們直接通過命令mvn clean package deploy部署,成功后,在GitHub用戶頁面可以看到該Artifact:
完整的配置請參考complex項目,這是一個非常簡單的支持復數運算的庫。
使用該Artifact時,因為GitHub的Package只能作為私有倉庫使用,所以除了在使用方的pom.xml中聲明<repository>外:
<project ...>...<repositories><repository><id>github-release</id><name>GitHub Release</name><url>https://maven.pkg.github.com/michaelliao/complex</url></repository></repositories><dependencies><dependency><groupId>com.itranswarp</groupId><artifactId>complex</artifactId><version>1.0.0</version></dependency></dependencies>... </project>還需要把有讀權限的Token配置到~/.m2/settings.xml文件中。
小結
使用Maven發布一個Artifact時:
- 可以發布到本地,然后由靜態服務器提供repo服務,使用方必須聲明repo地址;
- 可以發布到central.sonatype.org,并自動同步到Maven中央倉庫,需要前期申請賬號以及本地配置;
- 可以發布到GitHub Packages作為私有倉庫使用,必須提供Token以及正確的權限才能發布和使用。
參考
Java教程:https://www.liaoxuefeng.com/wiki/1252599548343744
總結
以上是生活随笔為你收集整理的常用jar包_发布Maven包的正确姿势的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: k近邻回归算法python_经典算法之K
- 下一篇: unity导入osgb格式的数据_游戏开