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

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

我们打开其中hdf5-1.10.3-1.4.3.jar的manifest文件作为例子看看错误出在哪里。

大家注意到了没有,这里的jar包没有路径也没有版本号,这就导致tomcat加载的时候按照hdf5-1.10.3-1.4.3.jar的路径进行加载。

然而我们的工程中在对应位置并不存在这些jar,这也就导致了找不到jar的异常。我们工程中实际上有这些jar,只不过路径和名字不一样。在上图左边大家可以看到maven中其实已经有了这些jar,只不过名字后面多了版本号,路径在各自的maven仓库中。

到这里我们已经将出现问题的原因弄清楚了,接下来我们考虑下怎么解决。

解决方案

方案一:

删除Manifest中的classpath或者删除Manifest文件,这样就避免了加载不存在的jar包。但是每次maven更新的时候可能会覆盖掉你的修改,导致异常再次出现。

方案二:

按照加载提示的路径,将对应jar包复制过去并改名去掉版本号,但这样会造成jar冗余,同样的jar会加载两个。

方案三:

降级tomcat版本,使用8.5.0 或以下版本。8.5.0版本中不会对manifest进行分析加载,这样也就不会出现我们的异常了。

方案四

增加一下代码设置不扫描Manifest文件。

 @Bean
 public TomcatServletWebServerFactory tomcatFactory() {
  return new TomcatServletWebServerFactory() {
   @Override
   protected void postProcessContext(Context context) {
    ((StandardJarScanner) context.getJarScanner()).setScanManifest(false);
   }
  };
 }