如果在settings.xml中配置了镜像,则会忽略项目存储库

时间:2016-10-13 07:47:55

标签: maven repository maven-3

我使用本指南创建了一个项目存储库:https://devcenter.heroku.com/articles/local-maven-dependencies

如果我在.m2文件夹中的mirrors文件中注释掉settings.xml定义,这样可以正常工作。 如果定义了镜像,则不考虑项目存储库。我是否还必须将其添加为镜像?如果可以在pom.xml

内以某种方式处理,那将会很棒

的pom.xml

<repositories>
    <repository>
        <id>repo</id>
        <url>file://${project.basedir}/repo</url>
    </repository>
</repositories>

将Settings.xml

<mirrors>
<mirror>
  <id>de.companyname.repository.release</id>
  <mirrorOf>de.companyname.repository</mirrorOf>
  <url>https://repository.companyname.de/content/repositories/releases</url>
</mirror>
<mirror>
  <id>de.companyname.repository</id>
  <mirrorOf>de.companyname.repository</mirrorOf>
  <url>https://repository.companyname.de/content/repositories/snapshots</url>
</mirror>
<mirror>
  <id>nexus-else</id>
  <mirrorOf>*</mirrorOf>
  <url>http://nexus.companyname.de:8081/nexus/content/groups/public</url>
</mirror>
<mirror>
  <id>nexus</id>
  <mirrorOf>central</mirrorOf>
  <url>http://nexus.companyname.de:8081/nexus/content/groups/public</url>
</mirror>
<mirror>
  <id>nexus-snapshots</id>
  <mirrorOf>central-snapshots</mirrorOf>
  <url>http://nexus.companyname.de:8081/nexus/content/groups/public-snapshots</url>
</mirror>
</mirrors>

1 个答案:

答案 0 :(得分:3)

这是正常的,实际上是mirrors的通用用例。它们用于让Maven从<repository>元素中定义的另一个位置下载依赖项。有关如何执行此操作的更多信息in this related answer

在您的情况下,您有这种镜像配置:

<mirror>
  <id>nexus-else</id>
  <mirrorOf>*</mirrorOf>
  <url>http://nexus.companyname.de:8081/nexus/content/groups/public</url>
</mirror>

表示此<mirror>将镜像*,即所有存储库。因此,您的POM中的repo声明不会被考虑在内,因为此镜像已配置为镜像它。因此,Maven在file://${project.basedir}/repo处发出的每个请求实际上都会重定向到您的镜像URL。你有两个解决方案:

  • 不要告诉nexus-else镜像基于本地文件的存储库。你可以用

    做到这一点
    <mirror>
      <id>nexus-else</id>
      <mirrorOf>external:*</mirrorOf>
      <url>http://nexus.companyname.de:8081/nexus/content/groups/public</url>
    </mirror>
    
      

    external:*匹配除使用localhost或基于文件的存储库的存储库之外的所有存储库。当您要排除为集成测试定义的重定向存储库时,它与存储库管理器一起使用。

    由于您的repo声明是一个与您的localhost相关的文件存储库,因此nexus-else不会对其进行镜像。这还可以确保您将来添加的localhost上的任何其他基于文件的存储库也不会被镜像。

  • 使用以下命令从镜像配置中排除repo

    <mirror>
      <id>nexus-else</id>
      <mirrorOf>*,!repo</mirrorOf>
      <url>http://nexus.companyname.de:8081/nexus/content/groups/public</url>
    </mirror>
    
      

    *,!repo1 =除repo1以外的所有内容

    此解决方案可能比上面的解决方案更脆弱,因为您需要对存储库的ID进行硬编码。