java - 在 Maven 中使用自定义远程存储库时的奇怪行为

标签 java maven

我只是想了解 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 的类似问题得到了很好的回答 herehere .

关于java - 在 Maven 中使用自定义远程存储库时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8514134/

相关文章:

java - 集成Spring和jersey时在web.xml中指定context-param

java - 在 Maven 中,它的 "org.apache.commons.collections:commons-collections"与 "commons-collections:commons-collections"相同吗?

java - JLabel 随输入到 JTextArea 中的文本移动

java - 动态继承命名空间的 XSL 元素

java - 我将日期转换为分钟有什么错误?

java - 如何排除/忽略 maven-emma 插件检测的类/包?

java - 如何检测 Maven Artifact 的发布/快照版本控制?

java - 在哪里可以下载 JetBrains JDK?

使用 Hamcrest 进行 Java Junit 测试 : cannot create compositional Matcher

java - 无法通过 Tomcat7 Maven 插件启动 RESTEasy Maven 项目(ExecutionException)