遷移庫
製品庫和依賴庫遷移地址:arttest.maven.com.cn
該製品庫中已經將老的製品庫中的public-maven-remote庫遷移過來,部分依賴可以通過該庫進行下載。
新建了一個部門的maven庫vas-release-maven,存放遠程庫無法下載的平臺提供jar包,平臺提供的jar直接使用maven座標是無法在maven庫中進行,可以先把該jar包deploy到vas-release-maven庫中,然後使用座標在maven 中依賴就可以了。爲了方便開發人員引用,已要求製品庫管理員爲我們創建了一個虛庫vas-maven-virtual,該庫關聯了vas-release-maven和public-maven-remote兩個庫。使用該庫就可以實現maven遠程庫和本地部門庫的雙層引用,兩全其美。
maven依賴庫配置
由於切換了製品庫,需要將maven的settings.xml文件中配置的倉庫地址進行修改.(建議該配置僅在settings.xml中,將每個工程的pom.xml相關配置去除)
<profiles>
<profile>
<repositories>
<repository>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>central</id>
<name>vas-maven-virtual</name>
<url>https://arttest.maven.com.cn:443/artifactory/vas-maven-virtual</url>
</repository>
<repository>
<snapshots />
<id>snapshots</id>
<name>vas-maven-virtual</name>
<url>https://arttest.maven.com.cn:443/artifactory/vas-maven-virtual</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>central</id>
<name>vas-maven-virtual</name>
<url>https://arttest.maven.com.cn:443/artifactory/vas-maven-virtual</url>
</pluginRepository>
<pluginRepository>
<snapshots />
<id>snapshots</id>
<name>vas-maven-virtual</name>
<url>https://arttest.maven.com.cn:443/artifactory/vas-maven-virtual</url>
</pluginRepository>
</pluginRepositories>
<id>artifactory</id>
</profile>
</profiles>
<activeProfiles>
<activeProfile>artifactory</activeProfile>
</activeProfiles>
maven發佈庫配置
部分項目可能會開發二方庫,給其他項目使用,之前的做法可能有以下兩點:
- 項目發佈一個jar包,然後其他項目把該jar包拿過來使用(每次升級都要對該jar進行替換)。
- 項目發佈jar包,手動上傳到公共庫vas-release-maven中(每次升級均需要手動上傳),其他項目使用該jar時直接通過座標使用。
如之前在某個項目開發過類似服務註冊的starter模塊,該模塊爲每個微服務提供註冊服務信息的功能。以往的做法是register模塊作爲單獨的工程開發,與主版本不在同一個基線下。每次修改register模塊,均需要將該jar包放到主版本基線的lib目錄下,在主版本編譯時手動執行mvn clean install方法將該jar安裝在本地maven倉庫中。
這是一種比較容易想到的但是卻是比較麻煩的一種方法。
這裏提供了一個方法,可以在二方庫開發時,直接發佈到vas-release-maven中,在修改完register模塊後直接執行mvn clean deploy命令進行發佈。主版本不用做任何修改,仍然通過座標的方式就可以引用到修改後的模塊包。
這裏需要增加兩個配置
- 需要在待發布工廠的pom.xml文件中增加發布庫的配置如下:
<distributionManagement>
<repository>
<id>central</id>
<name>arttest-releases</name>
<url>https://arttest.maven.com.cn:443/artifactory/vas-release-maven</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<name>arttest-snapshots</name>
<url>https://arttest.maven.com.cn:443/artifactory/vas-release-maven</url>
</snapshotRepository>
</distributionManagement>
- 需要在maven的配置文件settings.xml中配置發佈庫的認證信息,也就是你要有可以發佈的權限,,注意這裏的id配置必須和上面的一直,否則發佈時會報認證失敗的錯誤.
<servers>
<server>
<id>central</id>
<username>10191192</username>
<password>******</password>
</server>
<server>
<id>snapshots</id>
<username>10191192</username>
<password>******</password>
</server>
</servers>
但是這個地方存在一個問題是,當主版本從遠程倉庫中拉取register模塊後,會在本地庫中緩存,此時如果register模塊更新發布,那如何在主版本中每次取到的都是遠程庫中最新的呢?這就涉及到mavn的機制了:倉庫一般分爲public(Release)倉和SNAPSHOT倉,前者存放正式版本,後者存放快照版本。如果在項目配置文件中(無論是build.gradle還是pom.xml)指定的版本號帶有’-SNAPSHOT’後綴,那麼打出的包就是一個快照版本。快照版本和正式版本的主要區別在於,本地獲取這些依賴的機制有所不同。
假設有兩個小組負責維護兩個組件,example-service和example-ui,其中example-ui項目依賴於example-service。而這兩個項目每天都會構建多次,如果每次構建你都要升級example-service的版本,那麼你會瘋掉。這個時候SNAPSHOT版本就派上用場了。每天日常構建時你可以構建example-service的快照版本,比如example-service-1.0-SNAPSHOT.jar,而example-ui依賴該快照版本。每次example-ui構建時,會優先去遠程倉庫中查看是否有最新的example-service-1.0-SNAPSHOT.jar,如果有則下載下來使用。即使本地倉庫中已經有了example-service-1.0-SNAPSHOT.jar,它也會嘗試去遠程倉庫中查看同名的jar是否是最新的。有的人可能會問,這樣不就不能充分利用本地倉庫的緩存機制了嗎?彆着急,Maven比我們想象中的要聰明。在配置Maven的Repository的時候中有個配置項,可以配置對於SNAPSHOT版本向遠程倉庫中查找的頻率。頻率共有四種,分別是always、daily、interval、never。當本地倉庫中存在需要的依賴項目時,always是每次都去遠程倉庫查看是否有更新,daily是隻在第一次的時候查看是否有更新,當天的其它時候則不會查看;interval允許設置一個分鐘爲單位的間隔時間,在這個間隔時間內只會去遠程倉庫中查找一次,never是不會去遠程倉庫中查找(這種就和正式版本的行爲一樣了)
<repository> <id>myRepository</id> <url>...</url> <snapshots> <enabled>true</enabled> <updatePolicy>XXX</updatePolicy> </snapshots> </repository>