maven - 如何解决jar冲突

1,050 阅读5分钟

Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。

1.核心功能

Maven的核心功能是合理叙述项目间的依赖关系,通俗点说就是通过pom.xml文件的配置获取jar包不用手动的去添加jar包。其本质就是通过配置pom.xml来获取jar包。

2.Maven能够解决什么问题

  1. 构建工程,
  2. 管理jar,
  3. 编译代码,
  4. 自动运行单元测试,
  5. 打包
  6. 生成报表,
  7. 部署项目,生成web站点。

3.maven仓库

Maven 仓库是项目中依赖的第三方库,这个库所在的位置叫做仓库。仓库就是存放jar包的地方。 仓库分为:本地仓库,第三方仓库,中央仓库

  • 本地:本地仓库在安装 Maven 后并不会创建,它是在第一次执行 maven 命令的时候才被创建。用来存储从远程仓库或者中央仓库下载的插件和jar包,默认本地仓库的位置在user.dir/.m2/repository
  • 远程:又称为第三方仓库,内部中心仓库和私服。私服:一般由公司自己设立,只为本公司内部共享使用,它既可以作为公司内部构建协作和存档,也可作为公用类库镜像缓存,减少在外部访问和下载的频率使用私服为了减少对中央仓库的访问私服可以使用的是局域网,中央仓库必须使用外网。也就是一般公司都会创建这种第三方仓库,保证项目开发时,项目所需用的jar都从该仓库中拿,每个人的版本就都一样。注意:连接私服,需要单独配置。如果没有配置私服,默认不使用
  • 中央repo1.maven.org/maven2 Maven 中央仓库由 Maven 团队自己维护,里面存储了非常全的 jar 包,它包含了绝大多数流行的开源Java构件。使用这个仓库,开发人员可以搜索所有可以获取的代码库。 获取jar包的过程:项目使用一些插件或jar包,当我们执行 Maven 构建命令时,Maven 开始按照以下顺序查找依赖的库
  1. 在本地仓库中搜索,如果找不到,执行步骤 2,如果找到了则执行其他操作。
  2. 在中央仓库中搜索,如果找不到,并且有一个或多个远程仓库已经设置,则执行步骤 4,如果找到了则下载到本地仓库中以备将来引用。
  3. 如果远程仓库没有被设置,Maven 将简单的停滞处理并抛出错误(无法找到依赖的文件)。
  4. 在一个或多个远程仓库中搜索依赖的文件,如果找到则下载到本地仓库以备将来引用,否则 Maven 将停止处理并抛出错误(无法找到依赖的文件)。

4.maven的常用命令

image.png

5.Maven的依赖管理

Maven 一个核心的特性就是依赖管理。当我们处理多模块的项目(包含成百上千个模块或者子项目),模块间的依赖关系就变得非常复杂,管理也变得很困难。针对此种情形,Maven 提供了一种高度控制的方法。 maven工程不直接将jar包导入到工程中,而是通过在pom.xml文件中添加所需的jar包的坐标。这样在需要引用jar包的时候,只要查找pom.xml文件,再通过pom.xml中的坐标,到一个专门用于存放jar包的仓库中根据坐标找到这些jar包,再把这些jar包拿去运行. 我们需要做的只是在每个项目的 pom 中定义好直接的依赖关系。其他的事情 Maven 会帮我们搞定。 不得不说的就是有这么一种相当常见的情况,比如说 A 依赖于其他库 B。如果,另外一个项目 C 想要使用 A ,那么 C 项目也需要使用库 B。这就会导致依赖传递,依赖传递就会导致依赖版本冲突!

POM 标签大全详解 www.runoob.com/maven/maven…

6.maven中依赖版本冲突如何解决--四种方式

一、第一声明优先原则: 在pom.xml文件中定义依赖,以首先定义的依赖为基准

<dependencies>
<!--   spring-beans-4.2.4 -->
  	<dependency>
  		<groupId>org.springframework</groupId>
  		<artifactId>spring-context</artifactId>
  		<version>4.2.4.RELEASE</version>
  	</dependency>
<!--   spring-beans-3.0.5 -->
  	<dependency>
  		<groupId>org.apache.struts</groupId>
  		<artifactId>struts2-spring-plugin</artifactId>
  		<version>2.3.24</version>
  	</dependency>
</dependencies>

二、路径近者优先原则: 也就是说当我们在pom.xml文件中单独添加了spring-bean的依赖,而struts-spring-plugin依赖于spring-bean,struts-spring-plugin与我们单独所定义的spring-bean是同级的,因此会以单独定义的bean依赖为基准

<dependency>
  	<groupId>org.springframework</groupId>
  	<artifactId>spring-beans</artifactId>
  	<version>4.2.4.RELEASE</version>
</dependency>

三、排除原则: 在指定struts2-spring-plugin版本的时候排除掉内部的jar包依赖spring-beans

<dependency>
  	<groupId>org.apache.struts</groupId>
  	<artifactId>struts2-spring-plugin</artifactId>
  	<version>2.3.24</version>
  	<exclusions>
  	   <exclusion>
  	      <groupId>org.springframework</groupId>
  	      <artifactId>spring-beans</artifactId>
  	   </exclusion>
       </exclusions>
</dependency>

四、版本锁定原则: 面对众多的依赖,版本锁定这一种方式不需要考虑依赖的路径、声明优化等因素,可以直接锁定所依赖jar包的版本,锁定后不会考虑声明顺序及路径。

<properties>
	<spring.version>4.2.4.RELEASE</spring.version>
	<hibernate.version>5.0.7.Final</hibernate.version>
	<struts.version>2.3.24</struts.version>
</properties>
 
<!-- 锁定版本,struts2-2.3.24、spring4.2.4、hibernate5.0.7 -->
<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring.version}</version>
		</dependency>
        </dependencies>
</dependencyManagement>

7.jar包冲突解决方式

maven项目在引入依赖的时候,可能会因为传递依赖引用了不同版本的jar包而导致冲突,一般的jar包冲突无伤大雅,但是有的会导致项目都启动不起来。第一件事肯定是看日志!一般情况下,日志就会告诉你哪个包有问题。若日志上面没有明显提示,把当前版本的代码引用到的包和上一版本做对比,清晰明了。常见的jar冲突(log4j和slf4j,fastjson和jackson,log4j和slf4j等)

引用:blog.csdn.net/pjh88/artic…