Maven神器无法解析;试图从错误的存储库中解析工件
Maven artifact cannot be resolved; attempting to resolve artifact from the wrong repository
升级我的 pom.xml 中的依赖项后,我在尝试下载新工件时收到以下错误(在本例中使用 maven 命令行 mvn spring-boot:run
)。
The following artifacts could not be resolved:
io.github.bonigarcia:webdrivermanager:jar:3.8.1,
org.zaproxy:zap-clientapi:jar:1.7.0: Could not find artifact
io.github.bonigarcia:webdrivermanager:jar:3.8.1 in spring-milestone
(https://repo.spring.io/milestone)
错误消息是正确的,https://repo.spring.io/milestone. It does exists in Maven central (https://repo.maven.apache.org/maven2) 中不存在工件,那么为什么 Maven 会在错误的存储库中查找工件?
我知道这与我的 Maven 设置 (settings.xml) 有关,我在其中定义了一个指向我们内部 Nexus 存储库的镜像。当我移除镜像时,Maven 成功地在 Maven Central 中查找并找到了工件。我不明白的是当 Nexus 中不存在工件时事情如何运作的机制,以及为什么这个镜像设置会改变第一次发现工件的方式。
来自settings.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 引导项目。我没有在我的 pom.xml 中定义任何存储库,但是由于我指定了 spring 引导父 pom,所以我继承了以下存储库:
来自 Spring 引导父 pom
<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>
当您告诉 Maven 使用镜像时,将使用该镜像而不是原始存储库。
这意味着当您镜像 "central" 时,您将无法访问 Maven Central 中不在该镜像中的任何内容。
You usually define the repos under repositories
并且每个都有一个标识符。该标识符随后用于镜像。在您的配置中,您使用 id central
镜像 repo
<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:
With Repositories you specify from which locations you want to download certain artifacts, such as dependencies and maven-plugins. Repositories can be declared inside a project, which means that if you have your own custom repositories, those sharing your project easily get the right settings out of the box. However, you may want to use an alternative mirror for a particular repository without changing the project files.
我通常会执行以下操作,这会让事情更容易维护
- 为 Nexus 中的每个必需的存储库创建一个 "remote" 存储库
- 在包含所有远程仓库的 Nexus 中创建一个 "group" 仓库
那么您只需要在 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>
升级我的 pom.xml 中的依赖项后,我在尝试下载新工件时收到以下错误(在本例中使用 maven 命令行 mvn spring-boot:run
)。
The following artifacts could not be resolved: io.github.bonigarcia:webdrivermanager:jar:3.8.1, org.zaproxy:zap-clientapi:jar:1.7.0: Could not find artifact io.github.bonigarcia:webdrivermanager:jar:3.8.1 in spring-milestone (https://repo.spring.io/milestone)
错误消息是正确的,https://repo.spring.io/milestone. It does exists in Maven central (https://repo.maven.apache.org/maven2) 中不存在工件,那么为什么 Maven 会在错误的存储库中查找工件?
我知道这与我的 Maven 设置 (settings.xml) 有关,我在其中定义了一个指向我们内部 Nexus 存储库的镜像。当我移除镜像时,Maven 成功地在 Maven Central 中查找并找到了工件。我不明白的是当 Nexus 中不存在工件时事情如何运作的机制,以及为什么这个镜像设置会改变第一次发现工件的方式。
来自settings.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 引导项目。我没有在我的 pom.xml 中定义任何存储库,但是由于我指定了 spring 引导父 pom,所以我继承了以下存储库:
来自 Spring 引导父 pom
<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>
当您告诉 Maven 使用镜像时,将使用该镜像而不是原始存储库。
这意味着当您镜像 "central" 时,您将无法访问 Maven Central 中不在该镜像中的任何内容。
You usually define the repos under repositories
并且每个都有一个标识符。该标识符随后用于镜像。在您的配置中,您使用 id 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:
With Repositories you specify from which locations you want to download certain artifacts, such as dependencies and maven-plugins. Repositories can be declared inside a project, which means that if you have your own custom repositories, those sharing your project easily get the right settings out of the box. However, you may want to use an alternative mirror for a particular repository without changing the project files.
我通常会执行以下操作,这会让事情更容易维护
- 为 Nexus 中的每个必需的存储库创建一个 "remote" 存储库
- 在包含所有远程仓库的 Nexus 中创建一个 "group" 仓库
那么您只需要在 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>