Maven 会下载一个新的 SNAPSHOT jar 来替换刚刚在同一构建中创建的 jar 吗?

pha*_*ani 5 java maven-3 maven

假设我们的构建是从 A 到 Z 构建模块。所有版本元素都设置为 -SNAPSHOT。

当我们构建 pom 文件时,maven 从项目 A 开始,然后转到 B,最后到达项目 Z。如果 Z 依赖于 A,maven 是否会检查远程存储库中是否有最新的 A-SNAPSHOT.jar 并可能替换A -SNAPSHOT.jar 刚刚作为 A/target/ 和/或本地 Maven 存储库中同一构建的一部分创建

我认为-o可以避免上述情况,但我只是想了解。

是否可以设置-o为特定的 groupId 以避免在上述情况下可能发生的模糊错误。

是否可以配置构建以下载本地存储库中不可用的任何工件,但不替换现有的工件。

Dan*_*iel 2

不,反应堆中的项目将始终优先于其他依赖项。

即使在以下情况下,这一点仍然成立:

  • 使用设置的标志运行 Maven -U,这意味着强制进行更新检查。
  • 在或 POM 中设置 为<updatePolicy>alwayssettings.xml
  • install插件配置为<installAtEnd>true</installAtEnd>

Maven 将找出哪些工件是您的 Reactor 的一部分,并将它们排除在更新检查之外。

这很容易证明。如果您尝试使用上述任一配置运行 Maven,您将看到 Maven 不会下载工件A(例如),因为每次下载都会记录在控制台中。

例如,假设您有以下根 POM:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.example</groupId>
  <artifactId>root</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>
  <name>root</name>
  <modules>
    <module>A</module>
    <module>B</module>
    ...
    <module>Z</module>
  </modules>
</project>
Run Code Online (Sandbox Code Playgroud)

每个模块如下所示:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.example</groupId>
    <artifactId>root</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <name>...</name>
  <artifactId>...</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>
</project>
Run Code Online (Sandbox Code Playgroud)

但最后一个看起来像这样:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.example</groupId>
    <artifactId>root</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <artifactId>Z</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>
  <name>Z</name>
  <dependencies>
    <dependency>
      <groupId>org.example</groupId>
      <artifactId>A</artifactId>
      <version>${project.version}</version>
    </dependency>
  </dependencies>
</project>
Run Code Online (Sandbox Code Playgroud)

那么不,模块 A 永远不会被存储库中的工件的另一个版本替换。