0
点赞
收藏
分享

微信扫一扫

maven如何配置统一依赖多版本共存?

本来可以通过在groupId后面加点来共存jar包的多版本,就像这样

<dependency>

<groupId>cn.hutool</groupId>

<artifactId>hutool-core</artifactId>

</dependency>

<!--添加同一依赖的不同版本:groupId后加.-->

<dependency>

<groupId>cn.hutool.</groupId>

<artifactId>hutool-core</artifactId>

<version>4.1.12</version>

</dependency>

<!--添加同一依赖的不同版本:groupId后加..-->

<dependency>

<groupId>cn.hutool..</groupId>

<artifactId>hutool-core</artifactId>

<version>4.5.1</version>

</dependency>

但是这个不符合我的需求,我的问题:

项目本身使用了 Apache poi 3.17 作为excel导出的依赖(既存功能),后来又引入了word生成工具poi-tl 1.10.0版本,使用的poi是4.1.2,导致依赖冲突。

具体体现是编译无问题,运行时poi-tl出现ClassNotFoundException异常(因为实际使用的是3.17)。

首先想到的是排包,使用高版本依赖,但是经测试发现使用4.1.2时原本的excel功能有问题,使用3.17的时候word功能有问题,即poi 3.17、4.1.2都需要!

解决方案

使用jarjar对依赖4.1.2的jar包修改包名,同时poi-tl也以相同方式修改包名。

首先是jarjar工具的下载,点击下载即可,​​jarjar.rar​​

使用方式

把下载的jarjar-1.4.jar包放在电脑里的一个英文目录下,同时把要修改的poi-4.1.2.jar也放在相同目录。

新建rule.txt,写上rule org.apache.poi.** com.apache.poi.@1,这个是改命规则,即把org.apache.poi.**的全改成com.apache.poi.**,其中的@1代表匹配第一个*或者**,如果后面还有,就使用@2、@3……

我的压缩文件里已经有rule.txt,可以参照着修改

可以先执行命令java -jar jarjar-1.4.jar strings poi-4.1.2.jar查看是否可以正确读取包名。

然后执行java -jar jarjar-1.4.jar process rule.txt poi-4.1.2.jar poi-4.1.2-new.jar,代表以rule.txt的规则修改poi-4.1.2.jar,生成的文件名为poi-4.1.2-new.jar,新文件名随意。

后面的问题就好解决了,使用这个jar包分别对poi-4.1.2.jar、poi-tl-1.10.0.jar、poi-ooxml-4.1.2.jar、poi-ooxml-schemas-4.1.2.jar执行上面第二个命令,最后把新打的jar包作为第三方依赖添加到项目里面。

实际最后运行的时候仍然会出现找不到类的情况,不过肯定不是poi里面的类了,这时只需要把缺少的jar包引入进来就行。

顺便附一个maven项目中引入第三方依赖的方式,以及让其打包的配置方式:

首先在src的同级目录创建一个lib的文件夹,放入jar包

maven如何配置统一依赖多版本共存?_maven

 

 

然后引用这两个jar包

<dependency>
<groupId>com.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
<!--system,类似provided,需要显式提供依赖的jar以后,Maven就不会在Repository中查找它-->
<scope>system</scope>
<!--项目根目录下的lib文件夹下-->
<systemPath>${basedir}/lib/poi-4.1.2-new.jar</systemPath>
</dependency>
<dependency>
<groupId>com.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>4.1.2</version>
<!--system,类似provided,需要显式提供依赖的jar以后,Maven就不会在Repository中查找它-->
<scope>system</scope>
<!--项目根目录下的lib文件夹下-->
<systemPath>${basedir}/lib/poi-scratchpad-4.1.2-new.jar</systemPath>
</dependency>

同时注意打包的地方也要改下,主要就是框里的内容

maven如何配置统一依赖多版本共存?_jar_02

 

 

<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
<resource>
<directory>lib</directory>
<targetPath>/BOOT-INF/lib/</targetPath>
<includes>
<include>**/*.jar</include>
</includes>
</resource>
</resources>
<finalName>${project.name}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
</configuration>
</plugin>
<plugin>
<!--主要使用的是maven提供的assembly插件完成-->
<artifactId>maven-assembly-plugin</artifactId>
<version>3.1.1</version>
<configuration>
<descriptors>
<!--具体的配置文件-->
<descriptor>src/main/assembly/package.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<!--绑定到maven操作类型上-->
<phase>package</phase>
<!--运行一次-->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<defaultGoal>compile</defaultGoal>
</build>

最后,在使用到poi4.1.2,poi-scratchpad-4.1.2的地方引入新的包的路径即可。

maven如何配置统一依赖多版本共存?_maven_03

 

 maven如何配置统一依赖多版本共存就介绍到这儿。

 



举报

相关推荐

0 条评论