2

我们已经将所有依赖项放到了两个单独的 pom 文件中,这些文件带有 dependencyManagement 部分。要求是允许构建具有快照依赖项的模块并使用发布版本发布。这两个 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的快照版本。

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

4

1 回答 1

2

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

然后考虑将其maven:X:1.0:pom移至个人资料。

于 2013-07-01T11:27:51.077 回答