`
xubindehao
  • 浏览: 244642 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Maven中<dependencies>节点和<dependencyManagement>节点的区别

阅读更多

以前一直没有在意,今天建立maven工程的时候在<dependencyManagement>节点下加入了junit依赖,结果在dependency Graph中没有发现junit的依赖关系,怎么回事?没有加入项目依赖?遂google之

 

得解释:

1 .使用项目继承

利用项目继承可以将结构信息,部署信息,共同的依赖信息放置在单一的位置。在每个工程的 pom 中:

[...]

<parent>

<groupId>org.apache.maven.proficio</groupId>

<artifactId>proficio</artifactId>

<version>1.0-SNAPSHOT</version>

</parent>

[...]

这使得项目的 pom 可以继承顶层 pom 中的定义,检查顶层 pom dependencies 部分:

<project>

[...]

<dependencies >

<dependency >

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>3.8.1</version>

<scope>test</scope>

</dependency >

</dependencies >

[...]

</project>

在各个子模块的 pom 中没有对 Junit 依赖的定义,但是从顶层 pom 中继承了依赖的定义。

为了看清楚可以在一个子模块 pom 所在目录下,执行命令

#mvn help:effective-pom

可以看到最终起效果的 pom ,这在找错时很有效。

2 .管理依赖

pom 中指明 dependency management 元素的方式 maven 结合项目继承来管理依赖。在多模块应用中,可能多个子项目会有共同的依赖。此时为了正确运行,必须让所有的子项目使用依赖项的同一版本。必须确保应用的各个项目的依赖项和版本一致,才能保证测试的和发布的是相同的成果。因此,应在顶层的 pom 中定义共同的依赖关系。

Proficio 应用的顶层 pom 中的 dependency management 段如下:

  <dependencyManagement>

    <dependencies >

      <dependency >

        <groupId>com.devzuz.mvnbook.proficio</groupId>

        <artifactId>proficio-model</artifactId>

        <c>${project.version}</version>

      </dependency >

      <dependency >

        <groupId>com.devzuz.mvnbook.proficio</groupId>

        <artifactId>proficio-api</artifactId>

        <version>${project.version}</version>

      </dependency >

      <dependency >

        <groupId>com.devzuz.mvnbook.proficio</groupId>

        <artifactId>proficio-core</artifactId>

         <version>${project.version}</version>

      </dependency >

      <dependency >

        <groupId>com.devzuz.mvnbook.proficio</groupId>

        <artifactId>proficio-store-memory</artifactId>

        <version>${project.version}</version>

      </dependency >

      <dependency >

        <groupId>com.devzuz.mvnbook.proficio</groupId>

        <artifactId>proficio-store-xstream</artifactId>

        <version>${project.version}</version>

      </dependency >

      <dependency >

        <groupId>org.codehaus.plexus</groupId>

        <artifactId>plexus-container-default</artifactId>

        <version>1.0-alpha-9</version>

      </dependency >

    </dependencies >

  </dependencyManagement>

注意 ${project.version} 变量指的是应用的 version

顶层 pom 中的 dependencies dependencyManagement 中的 dependencies 元素有一个重要的区别:

dependencyManagement 中的 dependencies 元素只表明依赖项版本的优先选择,并不影响项目的依赖项;而 dependencies 元素则影响项目的依赖项。

检查 Proficio api 模块的 pom:

<project>

  <parent>

    <groupId>com.devzuz.mvnbook.proficio</groupId>

    <artifactId>proficio</artifactId>

    <version>1.0-SNAPSHOT</version>

  </parent>

  <modelVersion>4.0.0</modelVersion>

  <artifactId>proficio-api</artifactId>

  <packaging>jar</packaging>

  <name>Proficio API</name>

  <dependencies >

    <dependency >

      <groupId>com.devzuz.mvnbook.proficio</groupId>

       <artifactId>proficio-model</artifactId>

    </dependency >

  </dependencies >

</project>

其中没有指明依赖项的版本信息,在顶层 pom 中的 dependencyManagement 中表明其优选的版本是 ${project.version} 1.0-SNAPSHOT 。为使其模块 pom 完整,其版本信息会注入其中。只有当 dependencies 元素中没有指明版本信息时, dependencyManagement 中的 dependencies 元素才起作用。

 

 

 

 

呵呵  一个是项目依赖,一个是多模块maven项目时候的依赖管理控制的.

分享到:
评论
6 楼 xl6861989 2015-11-02  
2 楼正确
5 楼 boyleichinasoft 2013-11-04  
:ar    row:
4 楼 337240552 2013-06-22  
kaqike 写道
dependencies中的jar直接加到项目中,dependencyManagement 是对子项目中可能使用的依赖进行管理,本项目中可能并不使用这些依赖

一句话,很到位,谢谢。
3 楼 kaqike 2011-06-10  
dependencies中的jar直接加到项目中,dependencyManagement 是对子项目中可能使用的依赖进行管理,本项目中可能并不使用这些依赖
2 楼 lukeyang2000 2010-08-20  
dependencyManagement 中的 dependencies 元素只表明依赖项版本的优先选择,并不影响项目的依赖项。所以Parent POM的有dependencyManagement 中的 dependencies 元素不会自动的加到child的dependencies 列表里。只有child里有同样的dependencies 时,才会被parent中dependencyManagement 中的 dependencies 元素所影响(主要是版本信息)。
1 楼 kcai678 2010-07-05  
两者的共同点,parent定义的依赖都会在子pom中继承。

两者的不同点在于:
如果在parent-pom中直接用:
<dependencies >
<dependency >
。。。
</dependency >
</dependencies > ,
那么在子pom中将只能被动的接受parent所定义的版本。

但是如果在parent-pom中用的是:
<dependencyManagement>
<dependencies >
<dependency >
。。。
</dependency >
</dependencies >
</dependencyManagement>
则留给了子pom一个可以更改物价版本的权利,而不必一定要继承parent所定义的版本。

不知道我的理解对不??呵呵

相关推荐

    使用Maven管理进行多模块开发案例

    &lt;dependencyManagement&gt; &lt;dependencies&gt; &lt;dependency&gt; &lt;groupId&gt;javax.servlet&lt;/groupId&gt; &lt;artifactId&gt;servlet-api&lt;/artifactId&gt; &lt;version&gt;2.5&lt;/version&gt; &lt;scope&gt;provided&lt;/scope&gt; &lt;/dependency&gt; ...

    eclipse + maven搭建SSM框架

    &lt;maven.compiler.compilerVersion&gt;1.8&lt;/maven.compiler.compilerVersion&gt; &lt;/properties&gt; &lt;/profile&gt; ``` **5. 创建SSM项目** - 在Eclipse中选择`New` -&gt; `Maven Project`,然后按照向导步骤操作: - `Next` -&gt; ...

    eclipse的maven项目中,通过mybatisgenerator工具自动生成实体类和Mapper

    1. **配置`mybatis-generator-maven-plugin`**:在`pom.xml`的`&lt;build&gt;`节点内添加插件配置,以便在构建过程中执行代码生成任务。示例代码如下所示: ```xml &lt;build&gt; &lt;plugins&gt; &lt;plugin&gt; &lt;groupId&gt;org.mybatis...

    SpringCloud简介+配置过程+demo程序

    &lt;dependencyManagement&gt; &lt;dependencies&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.cloud&lt;/groupId&gt; &lt;artifactId&gt;spring-cloud-dependencies&lt;/artifactId&gt; &lt;version&gt;Greenwich.SR3&lt;/version&gt; &lt;type&gt;pom&lt;/...

    maven生成web项目时pom配置

    在`pom.xml`的根节点下,`&lt;project&gt;`标签内,首先需要设置项目的基本信息,如groupId(组织ID)、artifactId(模块ID)、version(版本号)等,这些构成了Maven坐标,用于唯一标识项目。 ```xml &lt;project&gt; ...

    spark算子基础讲义1

    &lt;arg&gt;${project.build.directory}/.scala_dependencies&lt;/arg&gt; &lt;/args&gt; &lt;/configuration&gt; &lt;/execution&gt; &lt;/executions&gt; &lt;/plugin&gt; &lt;/plugins&gt; &lt;/build&gt; ``` Spark 算子是 Spark 框架中的一种核心组件,它提供了...

    创建Maven工程实现RestAsured框架

    同时,确保`&lt;properties&gt;`节点内的`&lt;project.build.sourceEncoding&gt;`和Java版本(`&lt;maven.compiler.source&gt;`和`&lt;maven.compiler.target&gt;`)已正确配置。 现在,我们已经准备好了使用RestAssured进行HTTP请求的环境...

    ActiveMQ教程

    这段代码展示了如何在Maven项目中添加ActiveMQ和其他相关依赖项。这里需要注意的是,每个依赖项都指定了特定的版本号,这有助于确保项目使用的库版本一致,避免因版本冲突而引起的问题。 综上所述,ActiveMQ作为一...

    MAVEN打可运行jar包

    【MAVEN打可运行jar包】是Java开发中常见的任务,用于将项目打包成一个可独立运行的JAR文件,方便部署和分发。在Java世界里,Maven是一个强大的项目管理和依赖管理工具,它通过配置文件(pom.xml)来管理项目的构建...

    Mybatis Generator自动生成代码实例(maven方式)

    &lt;artifactId&gt;mybatis-generator-maven-plugin&lt;/artifactId&gt; &lt;version&gt;1.4.1&lt;/version&gt; &lt;executions&gt; &lt;execution&gt; &lt;id&gt;Generate MyBatis Artifacts&lt;/id&gt; &lt;goals&gt; &lt;goal&gt;generate&lt;/goal&gt; &lt;/goals&gt; ...

    mybatis generator使用方法

    &lt;artifactId&gt;mybatis-generator-maven-plugin&lt;/artifactId&gt; &lt;version&gt;1.3.2&lt;/version&gt; &lt;executions&gt; &lt;execution&gt; &lt;id&gt;GenerateMyBatisFiles&lt;/id&gt; &lt;goals&gt; &lt;goal&gt;generate&lt;/goal&gt; &lt;/goals&gt; &lt;phase&gt;generate-...

    springBoot学习笔记整理

    - 添加 `spring-boot-maven-plugin` 配置至 `pom.xml` 文件的 `&lt;build&gt;` 节点中,并设置 `&lt;fork&gt;` 属性为 `true`,确保 devtools 能够正常工作: ```xml &lt;build&gt; &lt;plugins&gt; &lt;plugin&gt; &lt;groupId&gt;org.spring...

    maven下载、安装、配置与使用教程.zip

    4. 在 `&lt;profiles&gt;` 节点下可以添加远程仓库,用于特定项目的依赖。 四、Maven 使用 1. 创建 Maven 项目:使用 Maven Archetype 快速生成项目骨架。在命令行输入: ```bash mvn archetype:generate ``` 按照...

    Zookeeper实现简单的分布式RPC框架

    &lt;dependencies&gt; &lt;dependency&gt; &lt;groupId&gt;org.apache.zookeeper&lt;/groupId&gt; &lt;artifactId&gt;zookeeper&lt;/artifactId&gt; &lt;version&gt;3.5.7&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;io.netty&lt;/groupId&gt; ...

    spark 连接 mongodb 使用例子

    本示例将讨论如何使用Java语言在Spark中连接MongoDB进行CRUD(创建、读取、更新和删除)操作,同时涉及到Spring框架和Maven构建工具。 首先,我们需要确保已安装并配置了Spark、Java、MongoDB以及Maven。在Java项目...

    Maven多模块之父子关系的创建

    Maven多模块之父子关系的...本文详细介绍了Maven多模块之父子关系的创建,包括父模块和子模块的创建、父子模块继承关系、&lt;dependencies&gt;节点和&lt;dependencyManagement&gt;节点的作用等。希望对大家的学习和工作有所帮助。

    SpringBoot+Mybatis-Plus整合Sharding-JDBC5.1.1实现单库分表【全网最新】.doc

    &lt;dependency&gt; &lt;groupId&gt;com.alibaba&lt;/groupId&gt; &lt;artifactId&gt;druid&lt;/artifactId&gt; &lt;version&gt;1.2.8&lt;/version&gt; &lt;/dependency&gt; ``` 或者直接使用HikariCP: ```xml &lt;dependency&gt; &lt;groupId&gt;com.zaxxer&lt;/groupId&gt;...

    maven-3.2.3环境的配置的压缩包

    在这个例子中,`groupId`、`artifactId` 和 `version` 组成了项目的唯一标识,`dependencies` 节点则列出了项目所依赖的库。 总结来说,Maven 3.2.3 的环境配置主要包括下载、环境变量设置、验证安装、定制配置和...

    maven资源zip包连接阿里maven库各种包齐全

    Maven通过pom.xml文件中的&lt;dependencies&gt;节点来管理项目依赖。例如,引入Spring框架的依赖: ```xml &lt;dependency&gt; &lt;groupId&gt;org.springframework&lt;/groupId&gt; &lt;artifactId&gt;spring-context&lt;/artifactId&gt; &lt;version...

Global site tag (gtag.js) - Google Analytics