我正在使用以下~/.m2/settings.xml
将所有maven存储库访问重定向到Artifactory:
<?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或移动{{1}旁边 - 比上面的~/.m2/settings.xml
命令更不方便解决方案应该递归工作,即包括所有子项目和子项目项目中的所有存储库等。
很有意义的是,解决方案不需要在没有代理的情况下直接从远程存储库下载依赖项,因为我希望在可能的情况下立即通过Maven代理传输它们 - 这不是必需的,虽然。
答案 0 :(得分:1)
有点hacky方法可能是这两个步骤:
获得有效的POM。请注意,下面的目标会生成一个包含所有POM的XML文件。但是,变量名称已经解析。
mvn help:effective-pom -Doutput="effective-pom.xml"
解析生成的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