Maven артефакт не может быть решен; попытка устранить артефакт из неправильного хранилища - PullRequest
1 голос
/ 21 января 2020

После обновления зависимости в моем pom. xml я получил следующую ошибку при попытке загрузить новый артефакт (в данном случае с помощью командной строки maven mvn spring-boot:run).

Следующие артефакты не могут быть разрешены: io.github.bonigarcia: webdrivermanager: jar: 3.8.1, org.zaproxy: zap-clientapi: jar: 1.7.0: Не удалось найти артефакт io.github.bonigarcia: webdrivermanager: jar: 3.8 .1 в вехе весны (https://repo.spring.io/milestone)

Сообщение об ошибке верно, что артефакт не существует в https://repo.spring.io/milestone. Он существует в центральном Maven (https://repo.maven.apache.org/maven2), так почему бы Maven искать артефакт в неправильном хранилище?

Я знаю, что это связано с моими настройками Maven ( настройки. xml) где я определяю зеркало для нашего внутреннего хранилища Nexus. Когда я снимаю зеркало, Maven успешно ищет и находит артефакт в Maven Central. Что я не понимаю, так это механизм того, как все работает, когда артефакт не существует в Nexus, и почему этот параметр зеркала меняет способ обнаружения артефакта в первый раз.

Из настроек. xml ..

<mirrors>
    <mirror>
        <id>Nexus</id>
        <name>Nexus Public Mirror</name>
        <url>https://myinternalnexushost.net/nexus/content/repositories/central</url>
        <mirrorOf>central</mirrorOf>
    </mirror>
</mirrors>

Также примечательно, что это проект Spring Boot. Я не определяю репозитории в моем pom. xml, но так как я указываю родительский pom для весенней загрузки, я наследую следующие репозитории:

Из родительского pom Spring Boot

  <repositories>
    <repository>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <id>spring-milestone</id>
      <name>Spring Milestone</name>
      <url>https://repo.spring.io/milestone</url>
    </repository>
    <repository>
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
      <id>spring-snapshot</id>
      <name>Spring Snapshot</name>
      <url>https://repo.spring.io/snapshot</url>
    </repository>
    <repository>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <id>rabbit-milestone</id>
      <name>Rabbit Milestone</name>
      <url>https://dl.bintray.com/rabbitmq/maven-milestones</url>
    </repository>
    <repository>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <id>central</id>
      <name>Central Repository</name>
      <url>https://repo.maven.apache.org/maven2</url>
    </repository>
  </repositories>

Ответы [ 2 ]

2 голосов
/ 21 января 2020

Обычно вы определяете репо под repositories, и у каждого из них есть свой идентификатор. Этот идентификатор затем используется для зеркал. В вашей конфигурации вы отражаете репо с идентификатором central

<mirrors>
    <mirror>
        <id>Nexus</id>
        <name>Nexus Public Mirror</name>
        <url>https://myinternalnexushost.net/nexus/content/repositories/central</url>
        <mirrorOf>central</mirrorOf>
    </mirror>
</mirrors>

Поскольку репо https://repo.spring.io/ имеет другой идентификатор, оно не отражается с помощью central. Таким образом, вы также должны определить зеркала для репозиториев друг друга, например,

<mirrors>
    <mirror>
        <id>Nexus</id>
        <name>Nexus Public Mirror</name>
        <url>https://myinternalnexushost.net/nexus/content/repositories/central</url>
        <mirrorOf>central</mirrorOf>
    </mirror>
    <mirror>
        <id>Spring</id>
        <name>Nexus Public Mirror</name>
        <url>https://myinternalnexushost.net/nexus/content/repositories/spring-milestone</url>
        <mirrorOf>spring-milestone</mirrorOf>
    </mirror>
</mirrors>

См. Также Guidelines :

В репозиториях вы указываете, из каких места, в которые вы хотите загрузить определенные артефакты, такие как зависимости и плагины maven. Репозитории могут быть объявлены внутри проекта, а это означает, что если у вас есть свои собственные репозитории, те, кто разделяет ваш проект, легко получают правильные настройки из коробки. Тем не менее, вы можете использовать альтернативное зеркало для определенного репозитория без изменения файлов проекта.

В общем, я бы сделал следующее, что упрощает поддержку

  • создать «удаленное» репо для каждого из необходимых репо в Nexus
  • создать «групповое» репо в Nexus, которое содержит все удаленные репо

, тогда вам нужно только указать это в вашем settings.xml

<mirrors>
    <mirror>
        <id>Nexus</id>
        <name>Nexus Public Mirror</name>
        <url>https://myinternalnexushost.net/nexus/content/repositories/maven-group</url>
        <mirrorOf>*</mirrorOf>
    </mirror>
</mirrors>
2 голосов
/ 21 января 2020

Когда вы говорите Maven использовать зеркало, это зеркало используется вместо исходного хранилища.

Это означает, что когда вы зеркалируете «центральный», вы теряете доступ ко всему в Maven Central, который не находится в этом зеркале.

...