当前位置: 首页 > 知识库问答 >
问题:

Maven中的导入和依赖关系管理

壤驷敏学
2023-03-14

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

Project_1POM文件:

    <dependencyManagement>  
    <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
          <scope>test</scope>
        </dependency>
      </dependencies> 
    </dependencyManagement>
</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中不可用。当我从POM文件中删除依赖管理标记project_1。一切工作正常。但是根据专家医生的说法,

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

我已经按文件上说的做了,这里出了什么问题?

共有2个答案

步弘和
2023-03-14

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

戚锦
2023-03-14

看起来您正在尝试使用BOM表POM并导入该POM。

在本例中,您的Project_1是BOM POM,您在

然而,要在项目中导入BOM POM,您需要两个

例如,您的Project_2pom.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>

ApacheMaven网站上有关于此的文档(搜索“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>

 类似资料:
  • 我正在使用Maven,我希望使用一些在dependencyManagement部分中有许多依赖项的工件作为父POM。但是我也希望在我的POM中有一个dependencyManagement部分,因为我的工件将是其他一些子模块的父POM。 示例: 假设这两个父POM都为某些依赖项定义了一个版本(假设jackson的版本),但每个都有不同的版本。

  • maven允许您在pom文件中定义: (A) - (B) /- 如果我把错误/未知的工件放在A类-maven肯定会失败。 如果我将错误/未知工件放在类别B上-maven只会在它影响类别A时失败(例如,A在上定义dep,B在

  • 我有一个漂亮的BOM,它的依赖管理部分有很多依赖项,我想创建另一个BOM来导入除一个之外的所有依赖项。我尝试这样做: POM在形式上是正确的,一切都可以编译。但是排除被简单地忽略了。我错过了什么?这种方法正确吗? 我正在使用Maven 3。

  • 问题内容: 我正在运行一个依赖groovy 1.7-beta-1的项目。gmaven插件使用groovy 1.6版作为依赖项。在pom中,我在依赖性管理部分中将grooyv-all版本指定为: 但是,当我在调试模式下运行maven时,我看到groovy 1.6被用于对gmaven插件的依赖。我以为我的依赖项管理部分会重写此设置,因此它们都使用1.7-beta-1,但是由于常规版本不同,我遇到了错误

  • 问题内容: 我有一个依赖关系如下: 当我部署一切正常时,这将拉下另一个引发ClassDefNotFound的依赖项。 我添加了两个依赖项,如下所示: 并且仍然面临着同样的问题,即:MVN带来下来不 我该如何解决? 编辑: 添加; 问题答案: 您可能有一个传递依赖项,另一个依赖项取决于您不需要的版本。 要获得所有直接和传递依赖关系的概述,请尝试: mvn依赖项:树 如果您发现同一依赖项的不同版本之间

  • 我尝试在依赖项中提供,这解决了构建问题,但在运行时遇到了以下问题。