转载请注明出处哈:http://yanan0628.iteye.com/blog/2270409
1.maven依赖的几个特性
1.1 依赖范围 -scope标签
maven在构建过程有3套classpath,我们会根据配置依赖的范围 依赖不同的classpath,如下图:
compile:默认是compile,对 编译 测试 运行 都有效
provided:对编译和测试classpath有效,运行的时候不需要加入,例如 jsp 依赖 searvlet api ,比如我们在编译和测试的时候有效但是在运行的时候 容器已经提供servletapi,如果加入会造成冲突
runtime:只在测试和运行时 有效,比较典型的例子 jdbc api,只有在启动代码测试或者运行的时候才会启用
test:只会在测试时有效,比较典型例子 就是junit ,只有再测试的时候 才会启用
1.2 依赖传递
比如我们引入某一个依赖spring-test,依赖传递特性会很方便帮助我们下来它相关的依赖,而不必有时会因为引入jar有问题而烦恼,但是也有弊端,存在一些不必要的依赖,可能会造成冲突。
1.3 依赖排除 -exclusion标签
依赖排除的特性 也是为了解决依赖冲突的一个方法,很方便去除依赖传递过程中不必要的依赖。在下面依赖冲冲突会用到 该标签。
1.4 依赖冲突产生原因
使用maven久了会发现存在依赖冲突的问题,由于依赖的传递特性会引入很多隐式的依赖和现有显示jar版本 所冲突,从而造成版本冲突的问题。要解决这个问题,首先就是要查看pom.xml显式和隐式的依赖类包, 然后通过这个类包树找出我们不想要的依赖类包,手工将其排除在外就可以了。
2.依赖冲突的解决
2.1两个基本原则:
1).短路优先原则
A->B->logback-1.0.jar
A->logback-1.1.jar
2).先声明先优先原则(先解析先引用)
与项目A pom中配置 引用坐标的顺序有关,如果依赖B在C前的话 就优先B,反之...
A->B->logback-1.0.jar
A->C->logback-1.1.jar
2.2 演示两个原则
1).创建三个maven工程
maven-01,maven-02,maven-03
2).三个工程依赖结构:
maven-01依赖 spring-test,maven-02,maven-03 (maven-02/03需要首先提交本地仓库,maven-01才能找到 ,可以参考寻找构件过程:1.3 仓库寻找构件过程) ;
maven-02依赖commons-logging-1.1.1;
maven-03工程依赖 commons-logging-1.1.3
3).看下myEclipse或者执行mvn dependency:tree 查看依赖树:
myeclispe:依赖树
4).冲突解决办法:
4.1 pom配置1:
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-test</artifactId>
- <version>4.2.2.RELEASE</version>
- <!-- 依赖排除 可以排除对commons-logging 的依赖
- <exclusions>
- <exclusion>
- <groupId>commons-logging</groupId>
- <artifactId>commons-logging</artifactId>
- </exclusion>
- </exclusions>
- -->
- </dependency>
- <!-- 添加对maven-02依赖 -->
- <dependency>
- <groupId>com.sohu.train</groupId>
- <artifactId>maven-02</artifactId>
- <version>1.0-SNAPSHORT</version>
- </dependency>
短路优先原则:
maven-01->spring-test->spring-core->commons-loggings-1.2(依赖深度3)
maven-01->maven-02->commons-loggings-1.1.1(依赖深度2)
所以maven01工程依赖的commons-loggings-1.1.1
4.2 pom配置2:
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-test</artifactId>
- <version>4.2.2.RELEASE</version>
- <!-- 依赖排除 -->
- <exclusions>
- <exclusion>
- <groupId>commons-logging</groupId>
- <artifactId>commons-logging</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <!-- 添加对maven-03依赖 -->
- <dependency>
- <groupId>com.sohu.train</groupId>
- <artifactId>maven-03</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- </dependency>
- <!-- 添加对maven-02依赖 -->
- <dependency>
- <groupId>com.sohu.train</groupId>
- <artifactId>maven-02</artifactId>
- <version>1.0-SNAPSHORT</version>
- </dependency>
先引用先优先的原则:
maven-01->spring-test->spring-core
maven-01->maven-02->commons-logging-1.1.1
maven-01->maven-03->commons-logging-1.1.3
如果pom先依赖maven-02则 依赖commons-logging-1.1.1 依赖;反之,如果pom先依赖maven-03则 依赖commons-logging-1.1.3 依赖
所有文章:
maven系列文章:
相关推荐
在压缩包中的“Maven依赖特性”可能包含了一些特定的示例或者配置,用于展示Maven如何处理不同类型的依赖特性,例如:范围(scope,如compile、test等)、排除依赖、强制版本等。通过实际操作这些例子,你可以更深入...
这款插件专为IntelliJ IDEA设计,旨在帮助开发者轻松解决Maven依赖冲突问题,提高开发效率。 **MavenHelper插件介绍** MavenHelper是一款强大的IDEA插件,它的主要功能是分析和可视化Maven项目的依赖树,帮助开发者...
5. **解决依赖问题**:如果遇到依赖冲突,Maven遵循“最接近原则”(nearest wins)进行解决,但也可以通过调整POM中的dependencyManagement来全局控制依赖版本。 6. **使用Maven仓库**:除了中央仓库外,还可以...
2. Maven依赖冲突特性 当不同依赖引入了相同但不同版本的库时,会产生依赖冲突。Maven遵循“nearest wins”原则解决冲突,但可能需要手动调整。 七、Maven工程继承和聚合关系 1. Maven工程继承关系 一个父pom可以...
1. **依赖管理**:Maven依赖是项目中各个模块之间共享代码的关键机制。当你在POM.xml文件中声明一个依赖,Maven会自动下载并管理这些依赖的版本,避免版本冲突。依赖可以通过`<dependencies>`标签进行定义,如`...
在使用"Maven依赖包"时,开发者需要注意以下几点: 1. **正确配置POM.xml**:确保所有必需的依赖项都已添加,并且版本号正确无误。 2. **理解依赖传递性**:Maven会自动处理依赖的依赖,但可能会导致依赖冲突,需要...
总之,"MavenHelper"是Java开发者处理Maven依赖冲突的理想工具。通过它,开发者可以更有效地管理项目中的依赖关系,避免因冲突带来的困扰,从而提高开发效率和项目质量。在实际开发中,熟练掌握并运用这款插件,无疑...
总的来说,搭建Kafka Java开发环境,主要是通过Maven在`pom.xml`中配置合适的Kafka依赖,并利用Maven自动管理这些依赖,确保项目的正常运行。同时,了解Kafka的基本概念和使用方式,有助于更好地开发基于Kafka的应用...
- 使用旧版本的`maven-jetty-plugin`可能会导致某些新特性无法使用或与其他库冲突,因此保持插件更新是很重要的。 6. 结论: `maven-jetty-plugin`简化了Java Web应用的开发和测试过程,通过Maven的命令行即可...
在没有Maven之前,开发者需要将所有依赖的jar包手动下载并添加到项目的lib目录中,这不仅繁琐,而且容易出错,例如版本冲突和依赖遗漏等问题。Maven通过中央仓库来管理这些依赖,开发者只需要在POM文件中声明依赖,...
依赖的版本冲突可通过依赖管理进行解决,Maven 会遵循“最接近原则”来选择依赖版本。 ** Maven 插件 ** Maven 插件是实现特定任务的工具,如编译源代码、运行单元测试、打包应用、部署应用等。开发者可以在 POM ...
IDEA Maven Helper是一款针对IntelliJ IDEA(简称IDEA)开发的强大插件,它极大地简化了Maven项目的工作流程,帮助开发者更好地理解和管理Maven依赖关系。这款插件源自于对高效开发的追求,旨在解决在大型Maven项目...
在POM中声明依赖后,Maven会自动解决依赖树,处理版本冲突,并从仓库下载所需的库文件。 **四、插件 (Plugins)** Maven 插件扩展了Maven的功能,可以执行各种任务,如编译、测试、打包、部署等。在POM中定义插件...
"Mavenflink.rar"中的内容主要是针对Flink的Maven依赖库,Maven是Java项目管理的重要工具,通过管理项目的依赖关系,使得开发者可以方便地引用所需的库。在Flink项目中,正确配置Maven的pom.xml文件至关重要,它包含...
2. **更好的依赖管理**:Maven 3.0 对依赖解析进行了优化,解决了依赖冲突的问题,增强了传递性依赖的处理。它引入了新的依赖范围和更精确的依赖解析算法,减少了由于依赖问题导致的构建失败。 3. **增强的插件管理...
1. **依赖管理优化**:在 2.2.1 版本中,Maven 对依赖冲突的解决策略进行了优化,提高了依赖解析的效率和准确性。 2. **更好的错误报告**:相比于之前的版本,2.2.1 提供了更详尽的错误报告,帮助开发者快速定位和...
它会自动从Maven中央仓库下载这些依赖,并处理依赖之间的版本冲突。Maven的依赖管理原则遵循“最接近优先”,即优先使用项目直接声明的依赖版本。 ** Maven 插件 ** Maven 插件是实现特定构建任务的工具,如编译、...
**正文** Maven,作为Java开发中的一个项目管理和构建...理解并掌握Maven的基本原理和新特性,对于Java开发者来说至关重要,它可以帮助我们更好地组织项目,简化依赖管理,实现自动化构建,从而专注于业务逻辑的开发。
通过在`pom.xml`文件中声明项目依赖,Maven能够自动下载所需的库文件,并解决依赖冲突。中央仓库是Maven默认的依赖来源,但也可以自定义私有仓库。 3. **生命周期与构建过程**:Maven的生命周期包括清理(clean)、...