maven项目多版本互不兼容依赖冲突解决办法
记录一次maven多module工程的依赖冲突和解决办法
项目架构
- maven工程树形结构
|---parent
|---moduleA
|---moduleB
|---moduleC
- 工程描述
- 项目是单体项目
- moduleA和moduleB被moduleC引用
- 项目最终是在moduleC中打包成jar文件
冲突描述
- moduleA中引入了
selenium-chrome-driver
,而selenium
依赖高版本的guava
- moduleC中引入了
apache curator
,curator
依赖的是低版本的guava
,且moduleC引入了moduleA - 冲突是谷歌的
guava
包有两个版本,且高低版本互不兼容
冲突解决
- 新建一个maven项目或者module(不用继承父module),不选择原型创建
- 将其中一个依赖抽离出来,我这里选择抽离
selenium
- 抽离原则是项目中使用到的api更少,api使用更集中抽离谁(我这里是抽离
selenium
,因为我使用到的selenium
api都封装在一个类里) - 删除其它不需要的目录比如test和resource目录,只留下java目录和pom.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.xiaog</groupId>
<artifactId>chromewebdriver</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-chrome-driver</artifactId>
<version>3.141.59</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.1</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<relocations>
<relocation>
<pattern>com.google.guava</pattern>
<shadedPattern>org.xiaog.guava</shadedPattern>
</relocation>
<relocation>
<pattern>com.google.common</pattern>
<shadedPattern>org.xiaog.google-common</shadedPattern>
</relocation>
</relocations>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"></transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
- pom.xml中引入
selenium
,并使用了maven-shade-plugin
插件 maven-shade-plugin
是核心,它能修改依赖的包名,以及将依赖下载到jar中,这样就可以使用两个不同版本的guava包了,
因为我将com.google.guava
改成了org.xiaog.guava
了- java目录中可以不放代码,也可以放使用到依赖的代码
- 然后maven install
不积跬步无以至千里