Maven导入范围未导入测试依赖项

时间:2018-10-18 21:15:49

标签: maven import dependency-management

我想在一个POM中同时定义大量compiletest依赖项,以将其导入到其他POM中。对于compile依赖项,一切正常。但是test依赖性在我项目的POM中没有解决。

她是一个极简主义的例子:

要导入的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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example.maven.import</groupId>
    <artifactId>pom-to-be-imported</artifactId>
    <packaging>pom</packaging>
    <version>1</version>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
                <version>3.8</version>
            </dependency>
            <dependency>
                <groupId>org.junit.jupiter</groupId>
                <artifactId>junit-jupiter-api</artifactId>
                <version>5.3.1</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
        </dependency>
    </dependencies>

</project>

使用导入的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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example.maven.import</groupId>
    <artifactId>pom-using-import</artifactId>
    <packaging>pom</packaging>
    <version>1</version>

    <dependencies>
        <dependency>
            <groupId>com.example.maven.import</groupId>
            <artifactId>pom-to-be-imported</artifactId>
            <version>1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>

</project>

当我运行dependency:tree时,它仅显示compile的{​​{1}}依赖性,而不显示JUnit commons-lang3的依赖性:

test

如何也可以导入>mvn dependency:tree . . . [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ pom-using-import --- [INFO] com.example.maven.import:pom-using-import:pom:1 [INFO] \- com.example.maven.import:pom-to-be-imported:pom:1:import [INFO] \- org.apache.commons:commons-lang3:jar:3.8:runtime [INFO] ------------------------------------------------------------------------ 依赖项? 我没有在maven documentation中找到任何内容,表明仅导入适用于test依赖项。

1 个答案:

答案 0 :(得分:1)

import范围仅在dependencyManagement部分内部使用。 (这个概念在Maven中也称为BOM。)来自maven documentation

  
      
  • 导入
  •   
     

仅在类型为pom的依赖项中支持此作用域   部分。

您有两种选择可以实现我认为想要的:

  1. 通过在pom-using-import中的import部分中添加dependencyManagement范围内的依赖项来正确使用导入机制。然后,您可以删除“要导入的pom”中的<dependencies>部分。每个“导入pom”都必须在<dependencies>部分中明确列出所有依赖项,但不必提供版本(或范围)。
<dependencyManagement>
    <dependency>
        <groupId>com.example.maven.import</groupId>
        <artifactId>pom-to-be-imported</artifactId>
        <version>1</version>
        <type>pom</type>
        <scope>import</scope>
    </dependency>
<dependencyManagement>
  1. 如果所有“导入pom”都需要相同的依赖项,则可以通过将“要导入的pom”声明为父级来使用继承,而不必使用import:
<project ...>
  <modelVersion>4.0.0</modelVersion>
    <parent>
      <groupId>com.example.maven.import</groupId>
      <artifactId>pom-to-be-imported</artifactId> <!-- Rename it to e.g. 'parent' -->
      <version>1</version>
      <relativePath>../pom-to-be-imported/pom.xml</relativePath>
    </parent>
    <artifactId>pom-using-import</artifactId>

替代2可能最接近您想要的。