用maven很长时间了(2年),下面把一些需要注意的细节加以总结:
情景一:
learn-1 pom.xml
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.1.4.RELEASE</version>
<!--依赖commons-logging 1.2的版本-->
</dependency>
<dependency>
<groupId>com.learn</groupId>
<artifactId>learn2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!--依赖commons-logging 1.1.3的版本-->
<optional>true</optional>
</dependency>
learn-2 pom.xml
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
mvn dependency:tree分别查看依赖情况:
[INFO] com.learn:learn2:jar:0.0.1-SNAPSHOT
[INFO] +- commons-logging:commons-logging:jar:1.1.3:compile
[INFO] \- junit:junit:jar:3.8.1:test
[INFO] ------------------------------------------------------------------------
[INFO] com.learn:learn1:jar:0.0.1-SNAPSHOT
[INFO] +- org.springframework:spring-core:jar:4.1.4.RELEASE:compile
[INFO] | \- commons-logging:commons-logging:jar:1.2:compile
[INFO] +- com.learn:learn2:jar:0.0.1-SNAPSHOT:compile
[INFO] \- junit:junit:jar:3.8.1:test
[INFO] ------------------------------------------------------------------------
结论:
learn1模块里的spring-core依赖common-logging的1.2版本,learn1依赖learn2,并且learn2也依赖common-logging,版本号是1.1.3。那么最后learn1将会依赖commons-logging的1.2版本,对于maven中的间接依赖,哪个依赖在pom文件中定义的位置在前面,就采用在前面定义的那个依赖。spring-core定义在learn2的前面,那么此时learn1就会依赖common-logging1.2的版本,如果spring-core和learn2的顺序调换一下,就会用commons-logging1.1.3的版本。
情景二:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<!-- 版本一 -->
<version>2.0.6</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<!-- 版本二 -->
<version>4.1.4.RELEASE</version>
</dependency>
分析结果:
[INFO] com.learn:learn1:jar:0.0.1-SNAPSHOT
[INFO] +- org.springframework:spring-core:jar:4.1.4.RELEASE:compile
[INFO] | \- commons-logging:commons-logging:jar:1.2:compile
结论:
learn1将会依赖后声明的版本为4.1.4.RELEASE的spring-core依赖,一个Pom文件中声明了对一个项目的高低版本的依赖,使用最后声明者。
情景三:
learn-1依赖项目learn-2,learn-3,learn-2依赖commons-logging:1.1.3版本,learn-3依赖learn-4, learn-4依赖commons-logging:1.2版本。那么最终learn-1依赖的commons-logging版本将会是1.1.3 版本的。这是因为maven采用
最短路径优先原则
情景四(optional):
learn5 pom.xml
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
<optional>true</optional>
</dependency>
learn6 pom.xml
<dependency>
<groupId>com.learn</groupId>
<artifactId>learn5</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
分析结果:
[INFO] com.learn:learn6:jar:0.0.1-SNAPSHOT
[INFO] \- com.learn:learn5:jar:0.0.1-SNAPSHOT:compile
如果learn5把commons-logging的optional标签注释掉,分析的结果将不一样。
分析结果:
[INFO]
com.learn:learn2:jar:0.0.1-SNAPSHOT
[INFO] \- com.learn:learn1:jar:0.0.1-SNAPSHOT:compile
[INFO] \- commons-logging:commons-logging:jar:1.2:compile
结论:
optional标签如果设置为true,意味着子模块将不依赖此模块,如果想依赖这个jar,必须在自己的pom.xml文件中在声明一遍。官方文档说:这样做为了避免错误jar违反license出现问题或者classpath发生问题。
友情提示:
如果我们的项目依赖出现问题,请善用mvn dependency:tree来查看依赖情况。
在附上一个mvn插件链接
http://maven.apache.org/plugins/index.html以供我们学习或者解决我们的实际问题。
分享到:
相关推荐
**一、Maven传递依赖** 传递依赖是指在Maven项目中,当一个项目A依赖于另一个项目B,而项目B又依赖于项目C时,项目A间接地依赖于项目C。这种关系使得A可以通过B来间接获取到C的类和资源。但是,并非所有的传递依赖...
Maven是Apache软件基金会的一个项目,用于项目对象模型(Project Object Model)的管理和构建自动化。...通过合理地使用POM文件、依赖范围、依赖调解和传递性依赖等机制,我们可以更好地构建和维护我们的Maven项目。
Maven依赖库是开发Java应用程序时不可或缺的资源,它包含了各种常用的jar包,这些包提供了丰富的功能,涵盖了数据处理、网络通信、XML解析等多个领域。在本文中,我们将深入探讨maven_repository.zip压缩包中的几个...
声明一个外部工作空间,该工作空间定义了一组Maven工件的传递依赖项。 状态:试验中,但正在其他内部项目中积极使用。 用法 1.将rules_maven添加到您的WORKSPACE git_repository ( name = "org_pubref_rules_...
7. **自定义规则**:对于企业内部的特殊依赖管理规则,MavenHelper还支持自定义配置,确保与团队的规范一致。 总之,"MavenHelper"是Java开发者处理Maven依赖冲突的理想工具。通过它,开发者可以更有效地管理项目中...
** 依赖管理和传递依赖 ** 在Maven的POM.xml文件中,开发者可以声明项目所需的依赖。Maven会自动解决这些依赖,并从仓库中下载它们。如果依赖之间存在版本冲突,Maven的依赖管理机制会根据优先级规则进行处理。此外...
- **传递依赖和范围(Transitive Dependencies and Scope)**:当项目依赖另一个项目时,后者的所有依赖也会被传递过来。 - **冲突解决(Conflict Resolution)**:当存在版本冲突时,Maven会按照一定的规则来决定使用...
这涉及到对Maven的依赖管理机制的理解,包括依赖范围(compile、runtime、test等)和传递性依赖。 3. **安全清除**:在确认无误后,工具将安全地删除这些未使用的依赖,释放磁盘空间。这个过程会避免误删重要的系统...
POM是Maven的核心概念,它定义了项目的配置、构建规则和依赖关系。通过POM,Maven可以自动下载项目所需的库文件,编译源代码,运行测试,打包应用,并部署到指定的服务器。POM中还可以定义构建过程中的各种插件和...
Maven的依赖管理不仅处理项目间的依赖,还通过传递性依赖解决了依赖树中的冲突问题。此外,Maven可以通过聚合项目(aggregation)功能管理多个模块项目,使得大型多模块项目构建变得简单。 总之,`apache-maven-...
- **3.4.4.1 传递依赖与依赖范围**:当一个项目依赖另一个项目时,后者的所有依赖也会被传递过来,但传递依赖的范围会受到限制。 - **3.4.5 冲突解决**:Maven 有一套规则来解决依赖冲突,通常会选择最新版本的依赖...
在Maven项目中,使用自己的jar包是一个常见的需求,特别是在开发过程中...在团队开发中,尽量避免过多使用`system`作用域的依赖,因为它们不被Maven的依赖管理和传递性依赖规则所覆盖,可能导致其他开发者遇到问题。
Maven使用传递性依赖管理,即如果项目A依赖B,B又依赖C,Maven会自动引入C。当多个依赖包含相同JAR但版本不同时,Maven有优先级规则来解决冲突,一般采用“最近使用”原则。 7. **多模块项目**: 大型项目往往由...
同时,Maven还处理依赖的传递性,即如果一个依赖自身又依赖其他库,Maven会自动处理这些间接依赖。 构建过程在Maven中是标准化的,包括编译、测试、打包、验证和部署等阶段。通过简单的命令,如`mvn clean install`...
- **依赖管理**: 在 `pom.xml` 中声明依赖,Maven 会自动处理依赖的传递性,确保所有依赖的正确引入。 5. **分模块构建** - Maven 支持多模块项目,可以在顶层 POM 中定义子模块,便于管理大型项目。 6. **Maven...
1. **快速定位依赖**: Maven Helper插件允许用户快速查看项目中的所有依赖关系,包括直接依赖和传递依赖。这在解决依赖冲突、查找特定库或检查项目依赖树时非常有用。用户可以通过插件直接在IDE内获取清晰的依赖图谱...
Maven遵循“传递性依赖”原则,这意味着它不仅下载直接依赖的库,还会下载这些依赖所依赖的库,直到所有的依赖都被解决。 1. **依赖解析顺序**: Maven首先解析`pom.xml`中的直接依赖,然后按照依赖的版本管理和...
当多个依赖包含相同的子依赖时,Maven 使用传递性依赖原则,根据依赖树的深度优先规则来选择。此外,`<dependencyManagement>` 标签可以用来统一管理项目的版本。 **六、Maven 的生命周期与构建阶段** Maven 的...
它使用传递性依赖的概念,意味着如果A依赖B,B又依赖C,那么Maven会自动将C一起引入。 ** Maven 插件 ** Maven 的功能通过插件实现,如编译、测试、打包、部署等操作都由特定的插件执行。开发者可以在 POM 文件中...
POM(Project Object Model)文件是Maven的核心配置文件,它定义了项目的构建规则和依赖关系等重要信息。一个典型的POM文件包括以下关键元素: 1. **`<modelVersion>`**:通常为`4.0.0`,表示POM文件遵循的格式版本。...