凸然

springboot项目使用loader.path启动服务时多版本依赖库引起的问题

平时在部署springboot项目时,会发现jar包太大,单是一个项目还没啥影响,但项目多了之后这个问题就比较突出了。

为了解决这个问题,就在启动命令中加了了-Dloader.path=“依赖库的目录”, 将所有工程中依赖的库都放在依赖库目录中,同时在工程中的build.gradle中添加如下配置。

bootJar {
    enabled = true
    excludes = ["*.jar"]
    manifest {
        attributes 'Main-Class': 'org.springframework.boot.loader.PropertiesLauncher'
    }
}

这样工程导出的jar就不包含依赖库,就很小很小了。

但今天却碰到因此导致的一个坑爹的问题

两个项目中都使用了poi库,但一个依赖的版本是5.2.2,一个是4.1.2。在工程中运行调试没有问题,但一部署到测试环境就出现

java.lang.NoSuchMethodError: org.openxmlformats.schemas.spreadsheetml.x2006.main.CTFont.addNewFamily()
Lorg/openxmlformats/schemas/spreadsheetml/x2006/main/CTIntProperty;

百度谷歌都找不到原因。

只知道是不同版本导致的问题,但我在build.gradle中明明指定了使用4.1.2版本的poi,为啥使用loader.path 加载的还是5.2.2版本的呢?

仔细对比了下包含依赖库打出的jar包与不含依赖库打出的jar包的区别, 发现没有依赖库的jar包中的classpath.idx文件是空的,

也就是说classpath.idx文件为空,导致依赖库的版本信息缺失, 这样在启动的时候,类加载器碰到多个相同的类名时,按加载器中默认的规则选择其中一个,
这样就有可能会出现上面的不同版本带来的问题。

以上只是猜测,毕竟也没有查到相关详细资料。

这样的话,解决办法也就只能将两个项目依赖的poi版本改成同一个了。

试了下,果然没问题了。


未完待续。










版权声明:本文为凸然网站的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:springboot项目使用loader.path启动服务时多版本依赖库引起的问题