• 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包

    然后引用这两个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>

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

    <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的地方引入新的包的路径即可。

     遇到的问题

    向上面那样配置,我本地打包没问题,但是jenkins打包就会报找不到jar包文件的错误,初步怀疑是服务器上的目录权限不够。于是我就决定把这两个修改过的poi jar包上传到maven私有仓库。

    mvn deploy:deploy-file -DgroupId="com.apache.poi" -DartifactId="poi" -Dversion="4.1.2" -Dpackaging="jar" -Dfile="./census-server/lib/poi-4.1.
    2-new.jar" -DrepositoryId="nexus-xxxx" -Durl="http://111.22.33.144:7777/repository/nexus-xxxx/"
    
    mvn deploy:deploy-file -DgroupId="com.apache.poi" -DartifactId="poi-scratchpad" -Dversion="4.1.2" -Dpackaging="jar" -Dfile="./census-server/lib/poi-scratchpad-4.1.2-new.jar" -DrepositoryId="nexus-xxxx" -Durl="http://111.22.33.144:7777/repository/nexus-xxxx/"

    -Dfile : 本地jar包全路径
    -DgroupId: pom中定义的<groupId>标签内容
    -DartifactId: pom中定义的<artifactId>标签内容
    -Dversion: pom中定义的<version>标签内容
    -DrepositoryId: 要上传的nexus仓库id
    -Durl:nexus仓库地址

    以上这些配置信息,在maven的根pom文件就可以找到。

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

  • 相关阅读:
    day07_09 metaclass创建一个类
    day07_12 python中的异常处理 与 自定义异常报错
    MS Project 中如何设定计划进行状态灯。
    1分钟创建图表[利用Office Web Component OWC组件]
    使用net use来定义工作共享盘的连接。
    用.NET创建Windows服务[转载]
    创建Text文件,使用不同的编码会造成生成乱码的现象和解决方法
    老大有没有搞错。
    一句话笑话
    sql点滴
  • 原文地址:https://www.cnblogs.com/shamo89/p/16651240.html
Copyright © 2020-2023  润新知