指定maven存储库,pom.xml或settings.xml的最佳位置在哪里?

时间:2010-02-08 22:57:34

标签: maven-2

为maven项目pom.xmlsettings.xml指定所需存储库的最佳位置在哪里?每个地点的利弊是什么?什么是最佳做法?

在我看来,在POM中定义存储库的原因有很多,原因如下:

  • 再现性:依赖工件来自在POM中明确声明的已知位置。用户配置错误的存储库导致问题的机会也会减少。
  • 可移植性:此POM将在安装了maven的任何人的计算机上构建。其他用户配置的存储库设置没有其他要求。
  • 易用性:新开发人员更容易检索和构建项目,因为设置的配置较少。

也许一个问题是,如果存储库的位置在将来发生变化,则需要安装代理,或者需要发布旧软件的补丁版本,指定新的存储库位置(或.m2/settings.xml始终可以提供额外的存储库作为最后的手段)。但是,这似乎是发布管理中良好的可重复性和可移植性的必要结果,而不是con。

还有其他想法吗?

3 个答案:

答案 0 :(得分:51)

  

为maven项目,pom.xml或settings.xml指定所需存储库的最佳位置在哪里?每个地点的利弊是什么?什么是最佳做法?

我个人定义项目pom.xml中特定项目所需的存储库,因为它使构建可移植。仅在我看来,settings.xml文件应该用于特定于用户或秘密的事情。不,真的,要求用户添加存储库位置,即使这是正确记录的,以某种方式击败了maven的一个功能(透明依赖性处理),我不喜欢这个想法。

我可以想到使用settings.xml来处理存储库的唯一“好”用例是当你有一个公司存储库并希望Maven使用这个存储库而不是公共存储库时。例如,要避免与任何公共存储库的连接,您可以将公司存储库声明为所有存储库的镜像:

<settings>
  ...
  <mirrors>
    <mirror>
      <id>proxy-of-entire-earth</id>
      <mirrorOf>*</mirrorOf>
      <name>Maven Repository Manager running on repo.mycompany.com</name>
      <url>http://repo.mycompany.com/proxy</url>
    </mirror>
  </mirrors>
  ...
</settings>

答案 1 :(得分:3)

我总是把URL放在POM中,密码放在settings.xml中。如果您将URL放在settings.xml中,则要求您的用户在您的URL发生更改时更新其本地系统上的文件。如果在POM中指定了URL,则可以更改它并推送新版本。网址更改的次数比大多数人预测的更频繁,并且会在构建中断时导致受挫的用户。

出于显而易见的原因,密码保存在settings.xml中。密码不应保留在版本控制中。您需要密码才能将mvn部署功能部署到远程存储库。

答案 2 :(得分:1)

我将为您提供三个原因,为什么您应考虑将存储库URL存储在settings.xml中而不是pom.xml中:

  1. spekdrum提到了实际上发生在我们身上的事情:
  

如果您有公司的存储库,并且正在为客户构建项目,并且必须在最后交付源代码,则最好在settings.xml中配置存储库。您不希望每次在办公室外建造项目时都可以到达Artifactory(或类似工厂)。

  1. Sonatype recommend的人将URL放置在settings.xml中。

  2. 如果依赖项存储库发生故障(请考虑java.net),则只需在一个地方更正URL。如果您使用pom.xml,则所有以前的发行版均已损坏。您可能必须为每个发行版提交固定的pom.xml

settings.xml中配置URL是否比pom.xml做更多的工作?绝对。

它为您带来更多的灵活性吗?绝对。

settings.xml应该是这样的:

<settings>
    <profiles>
        <profile>
            <id>mycompany-servers</id>
            <repositories>
                <repository>
                    <id>mycompany-release</id>
                    <url>https://mycompany.com/release/</url>
                    <snapshots>
                        <enabled>false</enabled>
                    </snapshots>
                </repository>
                <repository>
                    <id>mycompany-snapshot</id>
                    <url>https://mycompany.com/snapshot/</url>
                    <releases>
                        <enabled>false</enabled>
                    </releases>
                </repository>
            </repositories>
        </profile>
    </profiles>
    <activeProfiles>
        <activeProfile>mycompany-servers</activeProfile>
    </activeProfiles>
    <servers>
        <server>
            <id>mycompany-release</id>
            <username>your-username</username>
            <password>your-api-key</password>
        </server>
        <server>
             <id>mycompany-snapshot</id>
             <username>your-username</username>
             <password>your-api-key</password>
        </server>
    </servers>
</settings>