2017-05-31 94 views
5

我重定向到一個Artifactory的所有Maven倉庫的訪問具有以下~/.m2/settings.xml如何獲取Maven項目層次結構的所有遠程存儲庫?

<?xml version="1.0" encoding="UTF-8"?> 
<settings xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.1.0 http://maven.apache.org/xsd/settings-1.1.0.xsd" xmlns="http://maven.apache.org/SETTINGS/1.1.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<!-- unclear what version changes -> use 1.1.0 because it's higher --> 
    <servers> 
    <server> 
     <id>central</id> 
     <username>admin</username> 
    </server> 
    <server> 
     <id>snapshots</id> 
     <username>admin</username> 
    </server> 
    </servers> 
    <mirrors> 
    <mirror> 
     <id>artifactory</id> 
     <name>artifactory</name> 
     <mirrorOf>*</mirrorOf> 
     <url>https://[hostname]:[port]/artifactory/remote-repos/</url> 
    </mirror> 
    </mirrors> 
    <profiles> 
    <profile> 
     <id>artifactory</id> 
     <repositories> 
     <repository> 
      <id>central</id> 
      <name>remote-repos</name> 
      <url>https://[hostname]:[port]/artifactory/remote-repos</url> 
      <snapshots> 
      <enabled>false</enabled> 
      <updatePolicy>interval:25200</updatePolicy> 
      </snapshots> 
     </repository> 
     <repository> 
      <id>snapshots</id> 
      <name>remote-repos</name> 
      <url>https://[hostname]:[port]/artifactory/remote-repos</url> 
      <snapshots /> 
     </repository> 
     </repositories> 
     <pluginRepositories> 
     <pluginRepository> 
      <id>central</id> 
      <name>remote-repos</name> 
      <url>https://[hostname]:[port]/artifactory/remote-repos</url> 
      <snapshots> 
      <enabled>false</enabled> 
      <updatePolicy>interval:25200</updatePolicy> 
      </snapshots> 
     </pluginRepository> 
     <pluginRepository> 
      <id>snapshots</id> 
      <name>remote-repos</name> 
      <url>https://[hostname]:[port]/artifactory/remote-repos</url> 
      <snapshots /> 
     </pluginRepository> 
     </pluginRepositories> 
    </profile> 
    </profiles> 
    <activeProfiles> 
    <activeProfile>artifactory</activeProfile> 
    </activeProfiles> 
</settings> 

,因而必須被一個項目(及其子項目)指定的額外遠程存儲庫添加到Artifactory的實例。我目前使用

find . -name pom.xml -exec grep -B 5 -C 5 '<repository>' {} + 

如果URL是一個變量並在其他地方聲明並且不會跳過重複項,那麼它不是非常方便。這不是世界上最糟糕的事情,但也許有一個可以改進的地方。

下不起作用:

  • mvn versions:display-dependency-updates不顯示遠程倉庫
  • mvn dependency:list-repositories只工作到如果啓用了該代理第一依賴不能取出,使我有圖從哪裏得到它,加上研究遠程存儲庫artifactory的或移動~/.m2/settings.xml一邊 - 除上述

該解決方案的SHO find命令不太方便它包括所有子項目中的所有存儲庫和兒童子項目等。

它使得很多意義上的解決方案不需要直接從遠程存儲庫直接下載依賴關係,而無需代理服務器如果可能的話,我想立即通過Maven代理轉移它們 - 但這不是要求。

+0

運行一些庫的依賴可能被宣佈。這將使你下載這些依賴關係來找到所需的所有存儲庫.. –

+0

@StanislavBashkyrtsev我不明白你的意思是「一些存儲庫可以在依賴項中聲明」(POM的「dependencies」部分?) 。 –

+0

你有依賴關係。依賴有它自己的pom。在那個pom中你可能有倉庫部分。要知道你首先必須下載該依賴項。 –

回答

1

一個有點哈克的做法可能是這兩個步驟:

  1. 獲取有效的POM。請注意,以下目標一次生成包含所有POM的XML文件。但是,變量名稱已經解決。

    mvn help:effective-pom -Doutput="effective-pom.xml" 
    
  2. 解析生成的XML文件,並收集儲存庫,例如,使用Python腳本gather-repos.py

    #!/usr/bin/python 
    
    import sys, xml.etree.ElementTree as ET 
    root = ET.parse('effective-pom.xml').getroot() 
    repositories = dict() 
    for node in root.iter('{http://maven.apache.org/POM/4.0.0}repository'): 
        repo_id = node.findtext('{http://maven.apache.org/POM/4.0.0}id') 
        repositories[repo_id] = node 
    for node in repositories.itervalues(): 
        ET.ElementTree(node).write(sys.stdout, default_namespace='http://maven.apache.org/POM/4.0.0') 
    

當然,腳本然後可以通過

chmod +x gather-repos.py 
./gather-repos.py 
+0

看起來像一個好(雖然哈克 - 我同意)解決方案:)'ET.parse('tmp')'可能是'ET.parse('effective-pom。xml')',它會很好,如果它會遞歸地工作,它似乎不像我測試的那樣(使用https://github.com/javaee/glassfish) - 我只提到這個問題會影響到孩子項目,所以現在我澄清該解決方案應遞歸工作。 –

+0

它必須是'effective-pom.xml',絕對。 :)所以,遞歸的依賴關係?也許這個腳本可以擴展到在本地Maven倉庫中對POM進行遞歸操作。如果我正確理解了你對'dependency:list-repositories'的評論,那麼'dependency'插件無法解決所有的依賴關係,因此依賴圖的步行需要「手動」完成。 –

+0

如果啓用了代理,'dependency:list-repositories'只會起作用(在'settings.xml'中,如上所示) –