【问题标题】:Failed to scan some Jars from classloader hierarchy无法从类加载器层次结构中扫描一些 Jar
【发布时间】:2018-01-08 02:10:36
【问题描述】:

我在我的项目中使用 Spring Boot 2.0.0.M2 和 Vaadin 8.1.0.rc1。由于我需要使用自定义小部件,因此我已将 vaadin-client-compiler 依赖项添加到我的项目中。发生的第一件奇怪的事情是嵌入式 Tomcat 自动被嵌入式 Jetty 取代。第二个问题是我在应用程序初始化期间开始收到这样的警告:

2017-08-01 11:07:27.822  WARN 1012 --- [           main] o.a.tomcat.util.scan.StandardJarScanner  : Failed to scan [file:/Users/mac/.m2/repository/com/vaadin/vaadin-sass-compiler/0.9.13/sac-1.3.jar] from classloader hierarchy

java.io.FileNotFoundException: /Users/mac/.m2/repository/com/vaadin/vaadin-sass-compiler/0.9.13/sac-1.3.jar (No such file or directory)
    at java.util.zip.ZipFile.open(Native Method) ~[na:1.8.0_101]
    at java.util.zip.ZipFile.<init>(ZipFile.java:219) ~[na:1.8.0_101]
    at java.util.zip.ZipFile.<init>(ZipFile.java:149) ~[na:1.8.0_101]
    at java.util.jar.JarFile.<init>(JarFile.java:166) ~[na:1.8.0_101]
    at java.util.jar.JarFile.<init>(JarFile.java:130) ~[na:1.8.0_101]
    at org.apache.tomcat.util.scan.JarFileUrlJar.<init>(JarFileUrlJar.java:60) ~[tomcat-embed-core-8.5.5.jar:8.5.5]
    at org.apache.tomcat.util.scan.JarFactory.newInstance(JarFactory.java:43) ~[tomcat-embed-core-8.5.5.jar:8.5.5]
    at org.apache.tomcat.util.scan.StandardJarScanner.process(StandardJarScanner.java:327) ~[tomcat-embed-core-8.5.5.jar:8.5.5]
    at org.apache.tomcat.util.scan.StandardJarScanner.scan(StandardJarScanner.java:277) ~[tomcat-embed-core-8.5.5.jar:8.5.5]
    at org.apache.jasper.servlet.TldScanner.scanJars(TldScanner.java:262) [apache-jsp-8.5.9.1.jar:2.3]
    at org.apache.jasper.servlet.TldScanner.scan(TldScanner.java:104) [apache-jsp-8.5.9.1.jar:2.3]
    at org.apache.jasper.servlet.JasperInitializer.onStartup(JasperInitializer.java:101) [apache-jsp-8.5.9.1.jar:2.3]
    at org.springframework.boot.web.embedded.jetty.JasperInitializer.doStart(JasperInitializer.java:91) [spring-boot-2.0.0.M2.jar:2.0.0.M2]
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) [jetty-util-9.4.6.v20170531.jar:9.4.6.v20170531]
    at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:131) [jetty-util-9.4.6.v20170531.jar:9.4.6.v20170531]
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:105) [jetty-util-9.4.6.v20170531.jar:9.4.6.v20170531]
    at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:113) [jetty-server-9.4.6.v20170531.jar:9.4.6.v20170531]
    at org.eclipse.jetty.server.handler.ScopedHandler.doStart(ScopedHandler.java:120) [jetty-server-9.4.6.v20170531.jar:9.4.6.v20170531]
    at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:844) [jetty-server-9.4.6.v20170531.jar:9.4.6.v20170531]
    at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:344) [jetty-servlet-9.4.6.v20170531.jar:9.4.6.v20170531]
    at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1501) [jetty-webapp-9.4.6.v20170531.jar:9.4.6.v20170531]
    at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1463) [jetty-webapp-9.4.6.v20170531.jar:9.4.6.v20170531]
    at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:785) [jetty-server-9.4.6.v20170531.jar:9.4.6.v20170531]
    at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:261) [jetty-servlet-9.4.6.v20170531.jar:9.4.6.v20170531]
    at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:545) [jetty-webapp-9.4.6.v20170531.jar:9.4.6.v20170531]
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) [jetty-util-9.4.6.v20170531.jar:9.4.6.v20170531]
    at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:131) [jetty-util-9.4.6.v20170531.jar:9.4.6.v20170531]
    at org.eclipse.jetty.server.Server.start(Server.java:452) [jetty-server-9.4.6.v20170531.jar:9.4.6.v20170531]
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:105) [jetty-util-9.4.6.v20170531.jar:9.4.6.v20170531]
    at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:113) [jetty-server-9.4.6.v20170531.jar:9.4.6.v20170531]
    at org.eclipse.jetty.server.Server.doStart(Server.java:419) [jetty-server-9.4.6.v20170531.jar:9.4.6.v20170531]
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) [jetty-util-9.4.6.v20170531.jar:9.4.6.v20170531]
    at org.springframework.boot.web.embedded.jetty.JettyWebServer.initialize(JettyWebServer.java:103) [spring-boot-2.0.0.M2.jar:2.0.0.M2]
    at org.springframework.boot.web.embedded.jetty.JettyWebServer.<init>(JettyWebServer.java:81) [spring-boot-2.0.0.M2.jar:2.0.0.M2]
    at org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory.getJettyWebServer(JettyServletWebServerFactory.java:537) [spring-boot-2.0.0.M2.jar:2.0.0.M2]
    at org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory.getWebServer(JettyServletWebServerFactory.java:175) [spring-boot-2.0.0.M2.jar:2.0.0.M2]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:161) [spring-boot-2.0.0.M2.jar:2.0.0.M2]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:134) [spring-boot-2.0.0.M2.jar:2.0.0.M2]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:536) [spring-context-5.0.0.RC2.jar:5.0.0.RC2]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:122) [spring-boot-2.0.0.M2.jar:2.0.0.M2]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:750) [spring-boot-2.0.0.M2.jar:2.0.0.M2]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:386) [spring-boot-2.0.0.M2.jar:2.0.0.M2]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:327) [spring-boot-2.0.0.M2.jar:2.0.0.M2]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1245) [spring-boot-2.0.0.M2.jar:2.0.0.M2]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1233) [spring-boot-2.0.0.M2.jar:2.0.0.M2]

应用程序仍然正常工作:我只是想摆脱这些警告。所以我决定设置 Tomcat 而不是 Jetty,并像这样排除 Jetty:

<dependency>
    <groupId>com.vaadin</groupId>
    <artifactId>vaadin-client-compiler</artifactId>
    <version>${vaadin.version}</version>
    <exclusions>
        <exclusion>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-server</artifactId>
        </exclusion>
    </exclusions>
</dependency>

完成后,警告并没有消失,而是发生了一些变化:

java.io.FileNotFoundException: /Users/mac/.m2/repository/com/vaadin/vaadin-sass-compiler/0.9.13/sac-1.3.jar (No such file or directory)
    at java.util.zip.ZipFile.open(Native Method) ~[na:1.8.0_101]
    at java.util.zip.ZipFile.<init>(ZipFile.java:219) ~[na:1.8.0_101]
    at java.util.zip.ZipFile.<init>(ZipFile.java:149) ~[na:1.8.0_101]
    at java.util.jar.JarFile.<init>(JarFile.java:166) ~[na:1.8.0_101]
    at java.util.jar.JarFile.<init>(JarFile.java:130) ~[na:1.8.0_101]
    at org.apache.tomcat.util.scan.JarFileUrlJar.<init>(JarFileUrlJar.java:60) ~[tomcat-embed-core-8.5.15.jar:8.5.15]
    at org.apache.tomcat.util.scan.JarFactory.newInstance(JarFactory.java:49) ~[tomcat-embed-core-8.5.15.jar:8.5.15]
    at org.apache.tomcat.util.scan.StandardJarScanner.process(StandardJarScanner.java:338) ~[tomcat-embed-core-8.5.15.jar:8.5.15]
    at org.apache.tomcat.util.scan.StandardJarScanner.scan(StandardJarScanner.java:288) ~[tomcat-embed-core-8.5.15.jar:8.5.15]
    at org.apache.jasper.servlet.TldScanner.scanJars(TldScanner.java:262) [apache-jsp-8.5.9.1.jar:2.3]
    at org.apache.jasper.servlet.TldScanner.scan(TldScanner.java:104) [apache-jsp-8.5.9.1.jar:2.3]
    at org.apache.jasper.servlet.JasperInitializer.onStartup(JasperInitializer.java:101) [apache-jsp-8.5.9.1.jar:2.3]
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5196) [tomcat-embed-core-8.5.15.jar:8.5.15]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [tomcat-embed-core-8.5.15.jar:8.5.15]
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1419) [tomcat-embed-core-8.5.15.jar:8.5.15]
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1409) [tomcat-embed-core-8.5.15.jar:8.5.15]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_101]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_101]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_101]
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_101]

我在 Vaadin 论坛上发现了一个thread,建议使用 8.0.32 版本的 Tomcat 来修复它。当我切换到它时,应用程序完全停止工作:

Caused by: java.lang.ClassNotFoundException: org.apache.juli.WebappProperties
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 29 more

然后我发现了一些其他线程建议使用 Tomcat 8.5.5,因为它有一些修复(不记得线程的 URL)。我试过 8.5.5:警告回来了。然后我也尝试了 8.5.19 甚至 9.0.0.M25,结果相同。

那么问题出在哪里:Spring、Tomcat、Vaadin 或 Maven 依赖项版本控制?我该如何解决?这些警告不会使应用程序失败,但我不希望它们出现在我的启动日志中。

更新

这是我的 POM,应用程序类和完整的 mvn spring-boot:run 输出:https://gist.github.com/dtitov/ce9c098c8aa64073b3a22d2178f9aac7

【问题讨论】:

    标签: maven tomcat spring-boot vaadin


    【解决方案1】:

    免责声明:也许这更适合作为评论,但它不适合空间。


    1) 您可以使用稳定版Vaadin 8.1.0vaadin-spring-boot-starter 2.0.1。 Vaadin 模块版本由vaadin-bom 管理(${vaadin.version} 是我的 pom 中的一个属性,值为 8.1.0):

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.vaadin</groupId>
                <artifactId>vaadin-bom</artifactId>
                <version>${vaadin.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    

    此后,您无需在每次更改 Vaadin 版本时都更改他们的版本(除非您确实需要使用特定版本):

    <dependency>
         <groupId>com.vaadin</groupId>
         <artifactId>vaadin-spring-boot-starter</artifactId>
     </dependency>
    

    2) 您应该使用与您的 Vaadin 版本相同的 vaadin-maven-plugin 以避免小部件集版本不匹配/问题。您使用的是 Vaadin 8.1.0,但插件版本是 8.0.6。您可以使用&lt;version&gt;${vaadin.version}&lt;/version&gt; 同步它们。


    3) 根据docs,vaadin-client-compiler 仅在编译时使用,不应与您的应用程序一起部署:

    vaadin-client-compiler-8.x.x.jar
    Vaadin 客户端编译器是一个 Java 到 JavaScript 的编译器,它允许构建客户端模块,例如服务器端应用程序所需的客户端引擎(小部件集)。例如,需要编译器将附加组件编译到应用程序小部件集,如“使用 Vaadin 附加组件”中所述。

    有关编译器的详细信息,请参阅“编译客户端模块”。 请注意,您不应将此库与 Web 应用程序一起部署。

    您可以将 &lt;scope&gt;provided&lt;/scope&gt; 添加到依赖项中,这应该可以解决您的 tomcat 问题。

    重要编辑:我检查了日志,看起来您甚至不需要在您的小部件集的类路径中使用它。 vaadin-maven-plugin 使用它来编译您的小部件集在幕后

    [信息] --- vaadin-maven-plugin:8.1.0:compile (default) @ test --- [信息] 使用 com.vaadin:vaadin-client-compiler 版本 8.1.0 [INFO] 编译模块 MyCustomWidgetSet [INFO] 计算“com.vaadin.client.metadata.ConnectorBundleLoader”的所有可能的重新绑定结果 ...

    删除它后,一切都按预期进行。不完全确定,但可能只需要certain add-ons or the vaadin-maven-plugin。到目前为止我不需要写任何东西,所以也许真正需要它的人可以提供更多见解。


    4)您也可以按照相同的docs 建议删除vaadin-client-compiled

    【讨论】:

    • 好的,长评论长答案:) 1) 感谢您指向 8.1.0(我已经使用 vaadin-spring-boot-starter 2.0.1),但它没有帮助。 2) 我尝试设置&lt;scope&gt;provided&lt;/scope&gt; 甚至&lt;scope&gt;compile&lt;/scope&gt;,但也无济于事:执行spring-boot:run 时仍然看到这些警告。 3) 在 POM 中提及 spring-boot-starter-tomcat 依赖项显然不会启用 Tomcat,因此 Jetty 仍然处于加载状态,我必须明确排除它。
    • @DmytroTitov 没问题。我有一个与您类似的设置,它工作得很好,很可能我们没有使用完全相同的附加组件,并且依赖项以不同的顺序定义。尽管如此,如果在 mvn clean boot:run 之后您仍然遇到问题,则 POM 中可能有问题。您能否分享一个sscce 来重现您的问题(pom、启动启动器类和基本 UI)?
    • @DmytroTitov 谢谢。您的 pom 在&lt;artifactId&gt;test/artifactId&gt; 中缺少&lt;,但否则我能够重现该问题。我已经更新了我的答案,请通过 2、3 和 4,因为 1 没有改变。简而言之,您可以从依赖项列表中删除vaadin-client-compiler,它应该没问题。还要确保您的 vaadin-maven-pluing 与框架的版本相同。
    • 非常感谢!这有帮助:)
    猜你喜欢
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    相关资源
    最近更新 更多