部署apollo-client到maven私服上時遇到的問題及排查過程


場景回顧:

應用客戶端如果需要接入到Apollo配置服務中心的話,需要引用apollo-client的依賴包使之與config-server保持連接,從而可以及時的收到更新之后的配置信息。

1.將apollo-client項目打包部署到自己公司的maven私服上去

在eclipse上部署maven項目到私服上去執行mvn clean package deploy命令,報錯如下: 

Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.8.2:deploy (default-deploy) on project apollo-client: Failed to deploy artifacts: 
Could not transfer artifact com.phicomm.smarthome:apollo-client:jar:0.0.1-20180604.034828-34 from/to snapshots (http://your.company.maven/repository/maven-snapshots/)
: Failed to transfer file: http://your.company.maven/repository/maven-snapshots/com/phicomm/smarthome/apollo-client/0.0.1-SNAPSHOT/apollo-client-0.0.1-20180604.034828
-34.jar. Return code is: 401, ReasonPhrase: Unauthorized. -> [Help 1]

在執行命令部署的時候提示沒有部署成功,分析上面的錯誤信息后找到了原因,是因為在向私服傳包的時候需要認證。

打開/Users/lingye/Project/maven/apache-maven-3.5.0/conf/settings.xml,發現配置還都是默認的...

<server>
  <id>siteServer</id>
  <privateKey>/path/to/private/key</privateKey>
  <passphrase>optional; leave empty if not used.</passphrase>
</server>

Maven 知識回顧:

  • maven中的倉庫分為兩種,snapshot快照倉庫和release發布倉庫。snapshot快照倉庫用於保存開發過程中的不穩定版本,release正式倉庫則是用來保存穩定的發行版本。
  • maven會根據模塊的版本號(pom文件中的version)中是否帶有-SNAPSHOT來判斷是快照版本還是正式版本。如果是快照版本,那么在mvn deploy時會自動發布到快照版本庫中,而使用快照版本的模塊,在不更改版本號的情況下,其他項目在依賴此項目的時候直接編譯打包時,maven會自動從鏡像服務器上下載最新的快照版本。
  • 如果是正式發布版本,那么在mvn deploy時會自動發布到正式版本庫中,而使用正式版本的模塊,在不更改版本號的情況下,編譯打包時如果本地已經存在該版本的模塊則不會主動去鏡像服務器上下載。

我們把上面的注釋掉后配置我們自己的服務器,並填入賬號密碼。

<server>
  <id>releases</id>
  <username>admin</username>
  <password>admin123</password>
</server>
<server>
  <id>snapshots</id>
  <username>admin</username>
  <password>admin123</password>
</server>

注意這里配置的server的id必須和pom文件中的distributionManagement對應倉庫的id保持一致,maven在處理發布時會根據id查找用戶名稱和密碼進行登錄和文件的上傳發布。
並且在自己的項目中加入發布到私服的配置。

<distributionManagement>
    <repository>
        <id>releases</id>
        <name>Nexus Release Repository</name>
        <url>http://you.company.com:5050/repository/maven-releases/</url>
    </repository>
    <snapshotRepository>
        <id>snapshots</id>
        <name>Nexus Snapshot Repository</name>
        <url>http://you.company.com:5050/repository/maven-snapshots/</url>
    </snapshotRepository>
</distributionManagement>

經過上面的配置 我們在eclipse中使用package deploy部署成功

然后我們在apollo客戶端嘗試引用試試,項目沒有啟動成功報錯提示沒有引入core 沒有找到Tracer而報錯了

2.咦,官網上命名說只依賴apollo-client就可以的,怎么還要依賴apollo-core包?

我又用上面的方法將core包發布到私服上面,而后在客戶端再次引入它,這下項目可以跑起來了,但是又找不到配置文件,但是我已經在啟動時加了-Denv=DEV,我嘗試使用-Ddev_meta=http://localhost:8080,這樣是可以的。

機智的我發現怎么跟文檔上說的不一樣,腦袋一轉發現問題並沒有這么簡單。

3.仔細閱讀了一下《分布式部署指南》中的最后一部分

https://github.com/ctripcorp/apollo/wiki/%E5%88%86%E5%B8%83%E5%BC%8F%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97

mvn clean deploy -DskipTests -pl apollo-client -am $META_SERVERS_OPTS

-pl(--projects <arg>) 手動選擇需要構建的項目,項目間以逗號分隔;
-am(--also-make) 構建指定模塊,同時構建指定模塊依賴的其他模塊;

 正規的流程是在項目外層的scripts/build.sh 來構建項目
   在此腳本的最后一段命令中將包部署上去的。

我們也來試一試,當然第一次也是失敗了。

Failed to deploy artifacts/metadata: Cannot access ${snapshots.repo} with type default using the available connector factories: BasicRepositoryConnectorFactory:
Cannot access ${snapshots.repo} using the registered transporter factories: WagonTransporterFactory: Unsupported transport protocol

這是因為沒有在setting.xml中配置發布項

<profile>
  <id>dev</id>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
         <releases.repo>http://you.company.com:5050/repository/maven-releases/</releases.repo>
         <snapshots.repo>http://you.company.com:5050/repository/maven-snapshots/</snapshots.repo>
    </properties>
</profile>

這次發布成功,在客戶端中只依賴一個apollo-client然后重新導入,會發現一下會引用過來兩個包apollo-client和apollo-core以及meta_info也會打入到core包中,我們啟動的時候只需要加上-Denv=DEV即可順利啟動了。

總結:沒有認真閱讀開源官方給出的說明文檔,下次要認真!

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM