繁体   English   中英

Maven中的导入和依赖管理

[英]Import and Dependency Management in Maven

我正在学习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文档

在本节中,仅对pom类型的依赖项支持此范围。 它指示要在指定的POM部分中用有效的依赖关系列表替换的依赖关系。 由于已替换它们,因此具有导入范围的依赖项实际上并不参与限制依赖项的可传递性。

我已经按照文档中所述进行了操作,这里出了什么问题?

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

在这种情况下,您的Project_1是BOM BOM,并且您在<dependencyManagement>元素中包括了所有项目的依赖项。 看来您执行正确。

但是,要在项目中导入BOM表POM,需要同时使用<dependencyManagement><dependencies>

例如,您的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网站上有关于此的文档 (搜索“ bom”)。

更新:

BOM表POM和父级POM类似但不同。 BOM POM仅用于将依赖项导入项目中。 父POM用于多模块项目,并允许您定义将由所有模块使用父POM继承的Maven坐标,插件和依赖项。

这是使用从父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>

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM