tomcat加载jar异常问题的分析与解决

2019-10-18 20:12:00于海丽

项目环境说明

tomcat:使用springboot内置版本 8.5.29 使用Maven进行依赖管理 spring boot 版本为2.0.1 spring 框架 版本为5.0.5 项目引用了Deep Learn 4 Java(一个非常棒的Java的机器学习库)
 <dependency>
 <groupId>org.deeplearning4j</groupId>
 <artifactId>deeplearning4j-core</artifactId>
 <version>1.0.0-beta3</version>
 </dependency>

有问题的jar依赖关系

跟踪分析

既然是在启动阶段报错,那就找到启动类添加断点,一步步跟踪下到底哪个阶段报的错误,然后再分析出错的原因。我跟踪调试了springboot的代码,找到jar的加载位置。主要的几个类和方法如下所示:

跟踪类org.apache.tomcat.util.scan.StandardJarScanner

方法doScanClassPath(...)

该方法会对所有classloader进行遍历,加载每一个classloader中jar包

上图标红处就是关键代码,其中变量classPathUrlsToProcess中存放的是所有待加载的jar信息,主要是jar包路径信息,我们可以看到这里面和我们在maven中看到的jar包是一样的。