2017-05-31 79 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'中,如上所示) –

相关问题