问题描述:
springboot启动报jar包扫描错误,但不影响项目正常使用:
Failed to scan [file:/Users/ds/.m2/repository/com/sun/xml/bind/jaxb-impl/2.2.11/jaxb-core.jar] from classloader hierarchy
java.io.FileNotFoundException: /Users/ds/.m2/repository/com/sun/xml/bind/jaxb-impl/2.2.11/jaxb-core.jar (No such file or directory)
原因分析:
高版本的tomcat除了加载maven管理的jar包外,还会对jar包中的manifest.mf文件进行分析,加载manifest.mf文件中classpath定义的jar包。
例如:com.sun.xml.bind.jaxb-impl-2.2.11.jar包的MANIFEST.MF文件中Class-Path有jaxb-core.jar,但是该jar包没有定义版本号和路径,导致tomcat从jaxb-impl-2.2.11.jar的路径加载jaxb-core.jar,从而找不到jaxb-core.jar出现Failed to scan的异常。但其实这个jar包已经在其它地方引用了。
解决方案:
方案一:
降低tomcat版本到8.5.0或以下,高版本tomcat会对jar包中的manifest.mf文件进行分析。
方案二:
在启动类中配置不扫描manifest文件
/**
* 不扫描Manifest文件
* @return
*/
@Bean
public TomcatServletWebServerFactory tomcatFactory() {
return new TomcatServletWebServerFactory() {
@Override
protected void postProcessContext(Context context) {
((StandardJarScanner) context.getJarScanner()).setScanManifest(false);
}
};
}