如果在配置文件中使用,Maven 导入的依赖项不会得到解析

标签 maven import dependency-management resolve profiles

我们已将所有依赖项转移到两个带有 dependencyManagement 部分的独立 pom 文件中。要求是允许构建具有快照依赖项的模块并使用发布版本进行发布。这两个 pom 文件(XY)包含所有模块的所有允许的快照版本,并且所有模块的所有发布版本。因此,模块 pom 文件有一个 dependencyManagement 部分,用于导入具有发布依赖项的 pom 文件,以及一个用于构建的配置文件,其中包含一个 dependencyManagement 部分,用于导入具有快照依赖项的 pom 文件。但问题是,从配置文件中的依赖项管理部分导入的依赖项在构建时不会得到解析(即使配置文件处于事件状态)。如果我们删除配置文件外部的 dependencyManagement 部分(包含发布版本的部分),这些问题就会得到解决。这是预期的行为吗?如果是这样,为什么?或者这是maven 中的一个错误?在 maven 2 和 3 中进行了测试。

以下示例 pom 文件显示了该问题。

项目X

<project>
<modelVersion>4.0.0</modelVersion>
 <groupId>maven</groupId>
 <artifactId>X</artifactId>
 <packaging>pom</packaging>
 <name>X</name>
 <version>1.0</version>
 <dependencyManagement>
   <dependencies>
     <dependency>
       <groupId>test</groupId>
       <artifactId>a</artifactId>
       <version>1.0</version>
     </dependency>
     <dependency>
       <groupId>test</groupId>
       <artifactId>b</artifactId>
       <version>1.0</version>
       <scope>compile</scope>
     </dependency>
   </dependencies>
 </dependencyManagement>
</project>

Y 项目

<project>
 <modelVersion>4.0.0</modelVersion>
 <groupId>maven</groupId>
 <artifactId>Y</artifactId>
 <packaging>pom</packaging>
 <name>Y</name>
 <version>1.0-SNAPSHOT</version>
 <dependencyManagement>
   <dependencies>
     <dependency>
       <groupId>test</groupId>
       <artifactId>a</artifactId>
       <version>1.1-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>test</groupId>
       <artifactId>b</artifactId>
       <version>1.1-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>test</groupId>
       <artifactId>c</artifactId>
       <version>1.0-SNAPSHOT</version>
       <scope>compile</scope>
     </dependency>
   </dependencies>
 </dependencyManagement>
</project>

Z项目

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>maven</groupId>
  <artifactId>Z</artifactId>
  <packaging>pom</packaging>
  <name>Z</name>
  <version>1.0</version>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>maven</groupId>
        <artifactId>X</artifactId>
        <version>1.0</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
  <profiles>
      <profile>
        <id>non-release</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <build>true</build>
        </properties>
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>maven</groupId>
                    <artifactId>Y</artifactId>
                    <version>1.0-SNAPSHOT</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
      </profile>
  </profiles>
</project>

mvn help:active-profiles 返回非发布。 但 mvn help: effective-pom 返回 test:a:1.0, test:b:1.0, test:c:1.0-SNAPSHOT

我还想获取 ab 的快照版本。

知道为什么会这样吗? 如果这是因为它得到解决的顺序,我怎样才能克服它在构建时解决快照依赖关系而不提及配置文件并在发布时解决发布版本?

最佳答案

这是因为 POM 的主要部分中有一个 dependencyManagement 部分,位于配置文件定义之外。这意味着其中包含的定义与配置文件无关,因此始终会被考虑在内。 Maven 中没有任何选项可以使其“忘记”依赖关系(一旦定义)——除非使用配置文件。

考虑将 maven:X:1.0:pom 移动到配置文件。

关于如果在配置文件中使用,Maven 导入的依赖项不会得到解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17396473/

相关文章:

Java - 引用maven依赖 - Selenium Chromedriver

java - 将接缝预订示例与 jboss 链接时出错

java - Eclipse 不要把 persistence.xml 放在我耳边

python - 从同一目录中的其他 python 脚本导入 python 脚本的方法

MySQL在线导入导出

Java 打包问题

android - 使用Gradle将Unirest添加到Android Studio

java - 非常轻量级的 Eclipse-Maven 集成 - 仅依赖项管理?

maven - Maven 中 pom.xml 中的依赖标签和插件标签有什么区别?

resources - Android Gradle 从依赖模块引用样式