我只是想了解 Maven 自定义远程存储库背后的逻辑。在一项实验中(在 OS X 中,使用命令行),我在 POM 中声明了一个远程存储库,如下所示:(实际上并不是真正的远程存储库,因为我使用的是 file:///...):
<repositories>
<repository>
<id>myRepository</id>
<url>file:///test_mvrepository/repository</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
此 POM 还声明了对某些 Artifact X(我的示例中的 JPL 库)的依赖关系,该 Artifact 仅存在于“远程”存储库中,而不存在于本地存储库中:
<dependencies>
<dependency>
<groupId>jpl</groupId>
<artifactId>jpl</artifactId>
<version>[3.1.4-alpha,]</version>
</dependency>
...
</dependencies>
当我执行此操作时:
mvn package
该项目按预期构建仅一次。如果我重复该操作,我将收到一条消息,指出我的 Artifact X 不可访问:
[ERROR] Failed to execute goal on project projectname: Could not resolve dependencies for project groupid:artifactid:jar:0.0.1-SNAPSHOT: Could not find artifact jpl:jpl:jar:3.1.4-alpha -> [Help 1]
这是完整的 POM:
<?xml version="1.0" encoding="UTF-8"?>
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>groupId</groupId>
<artifactId>artifactId</artifactId>
<version>0.0.1-SNAPSHOT</version>
<repositories>
<repository>
<id>repId</id>
<url>file:///test_mvrepository/repository</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>jpl</groupId>
<artifactId>jpl</artifactId>
<version>[3.1.4-alpha,]</version>
</dependency>
...
</dependencies>
</project>
经过一些调试后我发现,虽然我没有使用 mvn install
安装 POM , Artifact X 位于本地存储库中(其 POM、jar 和其他文件)。只有当我从本地存储库中删除该条目时,我才能再次重复该操作而不会收到错误消息。
事实上,我不必删除本地存储库中的所有条目,只需删除文件maven-metadata-local.xml
即可。 。该文件如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<groupId>jpl</groupId>
<artifactId>jpl</artifactId>
<versioning>
<release>3.1.4-alpha</release>
<versions>
<version>3.1.4-alpha</version>
</versions>
<lastUpdated>20111214230431</lastUpdated>
</versioning>
在我的远程存储库中,该文件名为 maven-metadata.xml
.
最后,如果我输入
mvn install
那么 X 总是可以按预期访问,而不是像前一种情况那样只能访问一次。
我无法理解这其中的逻辑。为什么我无法在此设置中要求 Maven 多次打包我的 Artifact ?对我来说,很明显,如果我没有将其安装在本地存储库中,那么它应该一次又一次地转到远程存储库。或者至少,它应该以一种我可以稍后引用的方式在本地存储库中安装必要的对象,而不是阻止所有 future 的 package
请求直到我手动删除该条目?这是 Maven 中的错误吗?感谢您的任何澄清!
更新: 如果它很重要,这就是我构建测试场景的方式:
我在本地存储库中安装了 JPL 库(它的依赖项给我带来了问题)。我用这个命令做到了:
mvn install:install-file -Dfile=jpl.jar -DgroupId=jpl -DartifactId=jpl -Dversion=3.1.4-alpha -Dpackaging=jar
我将本地存储库复制到文件系统中的新位置(我的“远程”存储库),并在这个新位置中更改了
maven-metadata-local.xml
的名称。 JPL 条目的数量仅为maven-metadata.xml
,如下所述:http://www.javaworld.com/community/node/3968 .我从本地存储库中删除了 JPL 条目。
最佳答案
如果您想创建一个远程存储库来保存您的 Artifact ,则必须使用部署
阶段(而不是安装
)将您的 Artifact 上传到其中> 阶段。
install
阶段将您的 Artifact 上传到您的local
存储库,该存储库位于 ~/.m2/
或 {USER.默认情况下为 HOME}/.m2/
。您的本地存储库只是远程存储库的缓存。
deploy
阶段使用 pom 文件中提供的 distributionManagement
信息将 Artifact 部署到远程存储库。您可以这样创建 distributionManagement 定义:
<distributionManagement>
<repository>
<id>SomeId</id>
<name>SomeName</name>
<url>file:///test_mvrepository/repository</url>
</repository>
</distributionManagement>
更多关于分发管理的引用,可以引用这个site .
由于您已经在 repositories
定义中引用了远程存储库,因此当您将 Artifact 部署到远程存储库一次时,它们将在未来的构建过程中被提取并缓存到您的本地存储库中。
您可以考虑阅读有关 repositories 的更多信息和 maven lifecycles 。还有一些关于 SO 的类似问题得到了很好的回答 here和 here .
关于java - 在 Maven 中使用自定义远程存储库时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8514134/