【问题标题】:Import and Dependency Management in MavenMaven 中的导入和依赖管理
【发布时间】:2017-11-28 03:36:58
【问题描述】:

我正在学习 maven 中的“导入”范围,并在下面做了一个示例项目,

Project_1 POM 文件:

    <dependencyManagement>  
    <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
          <scope>test</scope>
        </dependency>
      </dependencies> 
    </dependencyManagement>
</project>

project_2 POM 文件:

<parent>
<groupId>com.sample</groupId>
  <artifactId>project1</artifactId>
  <version>1.0-SNAPSHOT</version>
</parent>    
...
...
<dependencyManagement>  
      <dependencies>
        <dependency>
          <groupId>com.sample</groupId>
        <artifactId>project1</artifactId>
        <version>1.0-SNAPSHOT</version>
           <type>pom</type>
          <scope>import</scope>
        </dependency>
      </dependencies>
    </dependencyManagement>

但是,这会引发错误,指出 JUnit 包在 Project2 中不可用。当我从 project_1 POM 文件中删除 dependencyManagement 标记时。一切正常。 但根据maven docs

这个作用域只支持 pom 类型的依赖 部分。它表示依赖关系 替换为指定的依赖项的有效列表 POM 的部分。既然被替换了, 具有导入范围的依赖项实际上并不参与 限制依赖的传递性。

我已经按照文档中的说明做了,这里出了什么问题?

【问题讨论】:

    标签: java maven dependency-management


    【解决方案1】:

    您似乎正在尝试使用物料清单 (BOM) POM 并将其导入。

    在这种情况下,您的 Project_1 是 BOM POM,并且您将项目的所有依赖项包含在 &lt;dependencyManagement&gt; 元素中。看起来你这样做是正确的。

    然而,要在您的项目中导入 BOM POM,您需要 &lt;dependencyManagement&gt;&lt;dependencies&gt;

    例如,您的Project_2 pom.xml 应包括:

    <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.sample</groupId>
        <artifactId>project1</artifactId>
        <version>1.0-SNAPSHOT</version>
        <packaging>jar</packaging>
    
        <dependencyManagement>
            <dependencies>
                <!-- Imports the bill-of-materials POM. -->
                <dependency>
                    <groupId>com.sample</groupId>
                    <artifactId>bom</artifactId>
                    <version>1.0-SNAPSHOT</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <dependencies>
            <!-- Add a dependency from the BOM POM.
            Note: no version or scope is required, it's inherited from the BOM POM! -->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
            </dependency>
        </dependencies>
    </project>
    

    这是上述示例的 BOM 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.sample</groupId>
        <artifactId>bom</artifactId>
        <version>1.0-SNAPSHOT</version>
        <packaging>pom</packaging>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                    <version>3.8.1</version>
                    <scope>test</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    </project>
    

    Apache Maven 网站上有documentation about this(搜索“bom”)。

    更新:

    BOM POM 和父 POM 相似但不同。 BOM POM 纯粹用于将依赖项导入项目。父 POM 用于多模块项目,允许您定义 Maven 坐标、插件和依赖项,所有使用父 POM 的模块都将继承它们。

    这是一个使用从父 POM 继承的依赖项的示例。请注意,此处包含的几个元素在 BOM 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>
    
        <parent>
            <groupId>com.sample</groupId>
            <artifactId>parent</artifactId>
            <version>1.0-SNAPSHOT</version>
        </parent>
    
        <artifactId>project1</artifactId>
        <packaging>jar</packaging>
    
        <dependencies>
            <!-- Inherited from the parent POM. -->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</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.sample</groupId>
        <artifactId>parent</artifactId>
        <version>1.0-SNAPSHOT</version>
        <packaging>pom</packaging>
    
        <modules>
            <module>child1</module>
            <module>child2</module>
        </modules>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                    <version>3.8.1</version>
                    <scope>test</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <dependencies>
            <!--Global dependencies...-->
        </dependencies>
    
        <build>
            <pluginManagement>
                <!--Plugins...-->
            </pluginManagement>
        </build>
    </project>
    

    【讨论】:

    • 如果是这样,为什么要使用“导入”,然后添加依赖?我可以简单地在我的 project_2 中添加“依赖项”。因为我已经在 project_1 中定义了它“dependencyManagement”。
    • 也许我当时误读了你的问题,我认为这是关于使用“导入”和 BOM POM。是的,您可以在多模块项目中对父 POM 执行类似的操作。我会修改我的答案。
    【解决方案2】:

    首先确保您使用支持此功能的 Maven 版本 2.0.9 或更高版本。 其次,您的 Project1 Pom.Xml 缺少属性“包装”确保您的包装和类型具有相同的名称,以便它继承所有依赖项。

    此外,您的工件 ID 和组 ID 必须与项目 1 的 Pom.xml 文件相同,才能导入依赖项

    如有疑问,请参阅此链接 https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Importing_Dependencies

    【讨论】:

    • 我会说得更难。如果有人真的在使用 Maven 3.0.5 之前的东西,那是用户的错,很抱歉。
    • @khmarbaise 哦,是的,哈哈,只是确保
    猜你喜欢
    • 2015-07-12
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 2016-07-20
    • 2017-03-29
    • 2019-09-17
    相关资源
    最近更新 更多