使用 Maven 工具可以有效地解决 Java 项目中 Jar 包冲突或者重复加载的问题。接下来,我会详细讲解如何使用 Maven 工具来解决这个问题的完整攻略。
1. Maven依赖冲突的解决
Maven 场景中,当我们引用的多个 Jar 包中存在重复的类或者接口时,会出现冲突。这种冲突情况下,只有部分功能可以使用,或者无法正常使用。
为了解决这个问题,我们可以通过以下两种方式进行解决:
1.1 排除冲突依赖包
- 通过查看依赖树,分析出存在冲突的 Jar 包
- 在引用较多的 Jar 包时,我们可以增加以下配置项,然后再重新运行
mvn clean install
命令即可。此配置会排除掉一个 POM 文件中指定的依赖:
<dependency>
<groupId>xxx</groupId>
<artifactId>xxx</artifactId>
<version>x.x.x</version>
<exclusions>
<exclusion>
<groupId>xxx</groupId>
<artifactId>xxx</artifactId>
</exclusion>
</exclusions>
</dependency>
示例:
引入了两个版本不同的common-collections的依赖包,其中一个包(版本3.1)是由a依赖而来,另一个包(版本4.1)是由b依赖而来。而使用的是版本为3.1的common-collections。这样就会出现样例如下的冲突问题:
<dependency>
<groupId>xxx</groupId>
<artifactId>xxx-a</artifactId>
<version>x.x.x</version>
<exclusions>
<exclusion>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>xxx</groupId>
<artifactId>xxx-b</artifactId>
<version>x.x.x</version>
<exclusions>
<exclusion>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.1</version>
</dependency>
我们可以选择通过 mvn dependency:tree
命令查看冲突的依赖。排除掉b的commons-collections,留下a的即可。
<dependency>
<groupId>xxx</groupId>
<artifactId>xxx-a</artifactId>
<version>x.x.x</version>
<exclusions>
<exclusion>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>xxx</groupId>
<artifactId>xxx-b</artifactId>
<version>x.x.x</version>
<exclusions>
<exclusion>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>4.1</version>
</dependency>
1.2 使用Jar包的最新版本
当我们引用的多个 Jar 包中存在相同的类或者接口时,若需要使用某个 Jar 包的类或接口时,可以将其改为使用 Jar 包的最新版本。
在引用 Jar 包的依赖时,我们可以使用以下配置项,在 POM.xml 中引用依赖的 Jar 包时,使用 latest
关键字来引入 Jar 包最新版本。
<dependency>
<groupId>xxx</groupId>
<artifactId>xxx</artifactId>
<version>latest</version>
<type>jar</type>
</dependency>
示例:
引入了两个版本不同的fastjson的依赖包,我们选择使用最新版本的fastjson:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.75</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.76</version>
</dependency>
将版本修改为 latest
即可:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>latest</version>
</dependency>
2.解决依赖Jar包重复加载的问题
当出现依赖包重复加载时,我们可以使用 Maven 的 exclusions 属性来解决该问题。这里我们以 Spring 框架为例介绍。
1.打开 pom.xml 配置文件,找到依赖的父级项目
2.找到父级项目的依赖配置parent
下的
3.在有依赖冲突的 submodule 中,通过在依赖的配置中添加 exclusions 属性排除依赖。
<dependency>
<groupId>xxx</groupId>
<artifactId>xxx</artifactId>
<version>x.x.x</version>
<exclusions>
<exclusion>
<groupId>xxx</groupId>
<artifactId>xxx</artifactId>
</exclusion>
</exclusions>
</dependency>
示例:
在Maven的Spring框架场景中,JdbcTemplate和spring-webmvc使用了两次,因此冲突:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<version>2.3.5.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.3.5.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</exclusion>
</exclusions>
</dependency>
我们可以通过在 spring-boot-starter-jdbc
依赖和 spring-boot-starter-web
依赖的 exclusions
标签中,排除掉 spring-jdbc
和 spring-webmvc
依赖,解决这个问题。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<version>2.3.5.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.3.5.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
以上就是使用 Maven 工具解决 Jar 包冲突或重复加载问题的解决方案和示例。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用maven工具解决jar包冲突或重复加载的问题 - Python技术站