Maven中的导入和依赖管理

时间:2017-06-24 19:46:23

标签: java maven dependency-management

我正在学习" import" 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的部分。因为它们被替换了,   具有导入范围的依赖项实际上不参与   限制依赖的传递性。

我已经完成了文档中提到的,这里出了什么问题?

2 个答案:

答案 0 :(得分:0)

首先确保您使用支持此功能的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

答案 1 :(得分:0)

看起来您正在尝试使用物料清单(BOM)POM并导入它。

在这种情况下,您的 Date Category has_egg values 0 2017-01-01 Lunch True 0.0 1 2017-01-02 Lunch True 1.0 2 2017-01-02 Lunch False 1.0 3 2017-01-02 Dinner True 0.0 4 2017-01-12 Lunch False 2.0 5 2017-01-13 Breakfast False 0.0 6 2017-01-13 Dinner False 1.0 7 2017-02-04 Lunch True 0.0 是BOM POM,并且您在Project_1元素中包含了所有项目的依赖项。看起来你正确地做到了这一点。

要在项目中导入BOM POM,您需要同时<dependencyManagement><dependencyManagement>

例如,您的<dependencies> Project_2应包含:

pom.xml

以下是上述示例的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>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>

Apache Maven网站上有documentation about this(搜索&#34; bom&#34;)。

<强>更新

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>

    <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>

以下是上述示例的父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>