13

我目前在一个为很多人定义规则的环境中工作。我们目前使用 Hudson 和 Artifactory,我想评估切换到 Jenkins 和 Nexus 是否值得迁移成本(但这不是问题)。

为了评估它,我在本地设置了 Maven、Jenkins 和 Nexus,我尝试找到一个设置来使用之前的设置,以便我可以比较解决方案。这里的问题是:

  • 当我使用现有的 POM 并通过 Jenkins 构建和部署它时,它会自动部署到我们的旧环境中。
  • 然后我尝试在 Maven 的文件中定义该deploymentManagement部分.settings,但这是不允许的(请参阅配置 Maven,那里

    注意:安装和用户配置不能用于添加共享项目信息——例如,设置或公司范围。

  • 我当然可以复制整个文件,并更改每个 POM 中的 distributionManagement,但我想在不同的安装中使用相同的(不是复制的)示例。

我们当前的根 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。

4

1 回答 1

21

我在一个类似的团队中,为其他人提供工具。我们的父 POM(不是settings.xml)设置如下。-DuseTestRepo=true除非我的团队成员之一添加到 mvn 命令行,否则 prod 版本处于活动状态。您可以尝试更改激活以查找仅存在于 Jenkins 服务器上的特定文件(例如)。我还想知道 Maven 是否会在 repo URL 中插入属性。如果是这样,您可以在 settings.xml 中执行<url>${my.remote.repo}/releases</url>和定义。my.remote.repo那个没试过

<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.0POM,而 Nexus 将com.company:corporate-parent:1.0包含您测试所需的更改。

我还会考虑更改 settings.xml 中的本地存储库,这样您就不会混合来自两个远程存储库的工件。

于 2013-05-02T16:52:33.577 回答