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

Kay*_*ayJ 3 repository maven-3 maven

我使用本指南创建了一个项目存储库: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>
Run Code Online (Sandbox Code Playgroud)

设置.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>
Run Code Online (Sandbox Code Playgroud)

Tun*_*aki 5

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

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

<mirror>
  <id>nexus-else</id>
  <mirrorOf>*</mirrorOf>
  <url>http://nexus.companyname.de:8081/nexus/content/groups/public</url>
</mirror>
Run Code Online (Sandbox Code Playgroud)

这意味着这<mirror>将镜像*,即所有存储库。所以你repo在 POM 中的声明没有被考虑在内,因为这个镜像被配置为镜像它。因此,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>
    
    Run Code Online (Sandbox Code Playgroud)

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

    由于您的repo声明是指向本地主机的文件存储库,因此它不会被nexus-else. 这也确保您将来添加的本地主机上的任何其他基于文件的存储库也不会被镜像。

  • repo从镜像配置中排除:

    <mirror>
      <id>nexus-else</id>
      <mirrorOf>*,!repo</mirrorOf>
      <url>http://nexus.companyname.de:8081/nexus/content/groups/public</url>
    </mirror>
    
    Run Code Online (Sandbox Code Playgroud)

    *,!repo1 = 除了 repo1 之外的所有东西

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