文章目录

  • 错误如下 :
  • 原由
    • 第一次修改
    • 二次改造如下:

错误如下 :

15:01:57.051 [restartedMain] WARN  o.a.t.util.scan.StandardJarScanner - Failed to scan [file:/Users/cgh/.m2/repository/com/lowagie/itext/2.1.5/bcprov-jdk14-138.jar] from classloader hierarchy
java.io.FileNotFoundException: /Users/cgh/.m2/repository/com/lowagie/itext/2.1.5/bcprov-jdk14-138.jar (No such file or directory)at java.util.zip.ZipFile.open(Native Method)at java.util.zip.ZipFile.<init>(ZipFile.java:225)at java.util.zip.ZipFile.<init>(ZipFile.java:155)at java.util.jar.JarFile.<init>(JarFile.java:166)at java.util.jar.JarFile.<init>(JarFile.java:130)at org.apache.tomcat.util.compat.JreCompat.jarFileNewInstance(JreCompat.java:176)at org.apache.tomcat.util.scan.JarFileUrlJar.<init>(JarFileUrlJar.java:65)at org.apache.tomcat.util.scan.JarFactory.newInstance(JarFactory.java:49)at org.apache.tomcat.util.scan.StandardJarScanner.process(StandardJarScanner.java:374)at org.apache.tomcat.util.scan.StandardJarScanner.processURLs(StandardJarScanner.java:309)at org.apache.tomcat.util.scan.StandardJarScanner.doScanClassPath(StandardJarScanner.java:266)at org.apache.tomcat.util.scan.StandardJarScanner.scan(StandardJarScanner.java:229)at org.apache.jasper.servlet.TldScanner.scanJars(TldScanner.java:262)at org.apache.jasper.servlet.TldScanner.scan(TldScanner.java:104)at org.apache.jasper.servlet.JasperInitializer.onStartup(JasperInitializer.java:83)at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5132)at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1384)at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1374)at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266)at java.util.concurrent.FutureTask.run(FutureTask.java)at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134)at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909)at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:841)at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1384)at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1374)at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266)at java.util.concurrent.FutureTask.run(FutureTask.java)at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134)at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909)at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)at org.apache.catalina.core.StandardService.startInternal(StandardService.java:421)at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:932)at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)at org.apache.catalina.startup.Tomcat.start(Tomcat.java:456)at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:105)at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.<init>(TomcatWebServer.java:86)at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getTomcatWebServer(TomcatServletWebServerFactory.java:414)at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:178)at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:179)at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:152)at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140)at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:742)at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:389)at org.springframework.boot.SpringApplication.run(SpringApplication.java:311)at org.springframework.boot.SpringApplication.run(SpringApplication.java:1213)at org.springframework.boot.SpringApplication.run(SpringApplication.java:1202)at cn.com.dwsoft.DwPublicApplication.main(DwPublicApplication.java:48)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)

原由

由于spring boot启动 出现扫描jar 不存在的的异常, 并不影响使用
但是做为一个程序员有必要研究原因
根据 debug 找到

org.apache.tomcat.util.scan.StandardJarScanner.process(StandardJarScanner.java
org.apache.tomcat.util.scan.StandardJarScanner.processURLs(StandardJarScanner.java
org.apache.tomcat.util.scan.StandardJarScanner.doScanClassPath(StandardJarScanner.java

后找到代码

if ("jar".equals(url.getProtocol()) || url.getPath().endsWith(Constants.JAR_EXT)) {try (Jar jar = JarFactory.newInstance(url)) {if (isScanManifest()) {processManifest(jar, isWebapp, classPathUrlsToProcess);}callback.scan(jar, webappPath, isWebapp);}}

异常在 processManifest(jar, isWebapp, classPathUrlsToProcess); 方法中抛出
由于当前类 StandardJarScanner implements JarScanner 继承于 JarScanner
JarScanner 从 接口

public interface Context{/*** 获取  StandardJarScanner*/public JarScanner getJarScanner();
}

接下来找到类 TomcatServletWebServerFactory#postProcessContext(Context context) 方法解决
由于存在tomcat jar问题 后改造为
TomcatServletWebServerFactory tomcatContextCustomizers 的属性
后进行改造成功解决

参考内容 : 链接.

第一次修改

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

由于引入的tomcat jar包冲突,

根据:链接

二次改造如下:

Failed to scan [file:/Users/zzs/.m2/repository/com/sun/xml/bind/jaxb-impl/2.1/jaxb-api.jar] from classloader hierarchy

@Beanpublic WebServerFactoryCustomizer<TomcatServletWebServerFactory> customizer() {System.out.println("初始化配置加载webapp配置!!!!!");return (factory) -> {factory.addContextCustomizers((context) -> {((StandardJarScanner)context.getJarScanner()).setScanManifest(false);});};
}

spring boot启动 Failed to scan from classloader hierarchy 解决方案相关推荐

  1. Spring Boot启动过程源码分析--转

    https://blog.csdn.net/dm_vincent/article/details/76735888 关于Spring Boot,已经有很多介绍其如何使用的文章了,本文从源代码(基于Sp ...

  2. spring boot 启动类

    做项目用到spring boot 感觉spring boot用起来比较流畅.想总结一下,别的不多说,从入口开始. spring boot启动类Application.class 不能直接放在main/ ...

  3. Spring Boot启动过程(七):Connector初始化

    Connector实例的创建已经在Spring Boot启动过程(四):Spring Boot内嵌Tomcat启动中提到了: Connector是LifecycleMBeanBase的子类,先是设置L ...

  4. Spring boot 启动报错 'elasticsearchTemplate' that could not be found.

    Spring boot 启动报错 (a)异常信息 Error starting ApplicationContext. To display the conditions report re-run ...

  5. Spring boot 启动后执行特定的操作

    有时候我们需要在应用启动完成后执行一些特定的操作,比如: 删除一些临时文件或者Redis中的缓存 将一些字典类的数据加载到缓存,这样就不用每次去数据库中查了,有些关联数据从缓存中取得赋值就可以了,不再 ...

  6. Spring Boot 启动载入数据 CommandLineRunner

    Spring Boot 启动载入数据 CommandLineRunner 实际应用中,我们会有在项目服务启动的时候就去载入一些数据或做一些事情这种需求. 为了解决这种问题.Spring Boot 为我 ...

  7. 在Spring Boot启动时运行代码

    Spring Boot会自动为我们执行很多配置,但是迟早您将不得不做一些自定义工作. 在本文中,您将学习如何进入应用程序引导生命周期并在Spring Boot启动时执行代码 . 因此,让我们看看该框架 ...

  8. Spring Boot————Spring Boot启动流程分析

    一.引言 Spring Boot 的启动虽然仅仅是执行了一个main方法,但实际上,运行流程还是比较复杂的,其中包含几个非常重要的事件回调机制.在实际生产开发中,有时候也会利用这些启动流程中的回调机制 ...

  9. 强大的Spring Boot启动监听器事件-初始化系统账号密码

    文章目录 前言 一.SpringApplicationEvents 事件类型 1.1 ApplicationStartingEvent 1.2 ApplicationEnvironmentPrepar ...

最新文章

  1. 关于cocos2d的下载和安装
  2. QT安卓web使用mysql_Qt使用MySQL笔记一
  3. ios开发之 icon规范+启动图规范+启动页规范
  4. 【算法竞赛学习】气象海洋预测-Task2 数据分析
  5. 创建您的第一个servlet
  6. Redis遇到的那些坑
  7. wait_event_interruptible 在驱动中的应用
  8. 基于JAVA+Servlet+JSP+MYSQL的会议管理系统
  9. JDK8 有关集合部分常用的语法
  10. mysql数据库原理与应用武洪萍第三张答案_MySQL数据库原理及应用(第2版)(微课版)...
  11. Windows 7 多国语言包(MUI)
  12. 分享一个python连接zookeeper的坑:句柄无效
  13. SpringBoot中这样定义全局异常处理器Global Exception Handler
  14. android:viewpager实现图片循环滑动+索引点击事件
  15. pyecharts1.7.1实现地图可视化(空间数据可视化)
  16. android item间距,RecyclerView 设置item之间的间距
  17. java实现根据名单进行随机的小组分组。
  18. 预渲染插件prerender-spa-plugin使用总结
  19. CentOS yum 安装 EFK 7.17
  20. java+获取下个小时_Java获取系统时间少8个小时 | 学步园

热门文章

  1. Java--通讯录管理系统【课程设计】
  2. codeforces Army
  3. Java定时器Timer和第三方定时器Quartz
  4. 【业务理解】什么是SPU、SKU、SKC
  5. lombok基本使用
  6. 低代码助力生产管理:ERP生产管理系统
  7. 图像平滑c语言,OpenCV实现二值图像的边缘光滑处理
  8. h5页面旋转90度竖屏变横屏
  9. 「开机自启」macOS如何关闭开机自启动软件?
  10. Android绘图之Canvas变换(6)