我目前在一个为很多人定义规则的环境中工作。我们目前使用 Hudson 和 Artifactory,我想评估一下转向 Jenkins 和 Nexus 是否值得迁移成本(但这不是问题)。
为了评估它,我在本地设置了 Maven、Jenkins 和 Nexus,并尝试找到一个设置来尽可能多地使用以前的设置,以便我可以比较解决方案。这里的问题是:
然后我尝试在 Maven 中的
deploymentManagement
文件中定义 .settings
部分,但这是不允许的(请参阅配置 Maven,那里
注意:安装和用户配置不能用于添加共享项目信息 - 例如设置或公司范围。
我们当前的根 POM 包含以下部分:
<distributionManagement>
<repository>
<uniqueVersion>false</uniqueVersion>
<id>company-central</id>
<name>Company central maven respository</name>
<url>https://company.com/artifactory/libs-releases</url>
</repository>
<snapshotRepository>
<id>company-snaps</id>
<name>company-snapshots</name>
<url>https://company.com/artifactory/libs-snapshots</url>
</snapshotRepository>
<downloadUrl>https://company.com/artifactory/libs-releases</downloadUrl>
</distributionManagement>
使用相同的 POM 但将其部署到不同的存储库管理器的最简单方法是什么?
PS:我已经阅读了为不同的部署场景设置maven pom文件并且不喜欢它(在我的上下文中),将Maven工件部署到具有不同设置的多个存储库确实是一个不同的问题。 在 maven 中进行多次部署是一种有趣的方法,但我必须为此目的修改大量 POM。
我在一个类似的团队中,为其他人提供工具。 我们的parent POM(不是
settings.xml
)设置如下。 除非我的团队成员之一将 -DuseTestRepo=true
添加到 mvn 命令行,否则 prod 版本将处于活动状态。 您可以尝试更改激活以查找仅存在于 Jenkins 服务器上的特定文件(例如)。 我还想知道 Maven 是否会在存储库 URL 中插入属性。 如果是这样,您可以执行 <url>${my.remote.repo}/releases</url>
并在 my.remote.repo
中定义 settings.xml
。 没试过那个。
<profiles>
<profile>
<id>test-repository</id>
<activation>
<property>
<name>useTestRepo</name>
<value>true</value>
</property>
</activation>
<properties>
</properties>
<distributionManagement>
<repository>
<!-- ... -->
</repository>
<snapshotRepository>
<!-- ... -->
</snapshotRepository>
</distributionManagement>
</profile>
<profile>
<id>prod-repository</id>
<activation>
<property>
<name>!useTestRepo</name>
</property>
</activation>
<properties>
</properties>
<distributionManagement>
<repository>
<!-- ... -->
</repository>
<snapshotRepository>
<!-- ... -->
</snapshotRepository>
</distributionManagement>
</profile>
至于交付(部署)您的实验父 POM - 您会将其部署到您的测试 Nexus 存储库,对吗? 并且您的开发人员都无法访问该内容,只有您自己。 因此 Artifactory 将包含真正的
com.company:corporate-parent:1.0
POM,而 Nexus com.company:corporate-parent:1.0
包含您测试所需的更改。
我还会考虑更改 settings.xml 中的本地存储库,这样就不会混合来自两个远程存储库的工件。