【问题标题】:A lot of InvocationTargetException after starting tomcat启动tomcat后很多InvocationTargetException
【发布时间】:2021-10-08 09:52:46
【问题描述】:

当我使用我的应用启动 tomcat 时,我看到了很多:

02-Aug-2021 16:49:24.011 WARNING [main] org.apache.tomcat.util.scan.StandardJarScanner.processURLs Failed to scan [file:/opt/tomcat/apache-tomcat-9.0.50/lib/jakarta.annotation-api.jar] from classloader >
        java.io.IOException: java.lang.reflect.InvocationTargetException
                at org.apache.tomcat.util.compat.Jre9Compat.jarFileNewInstance(Jre9Compat.java:209)
Caused by: java.lang.reflect.InvocationTargetException
                at java.base/jdk.internal.reflect.GeneratedConstructorAccessor7.newInstance(Unknown Source)
                at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
                at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
                at org.apache.tomcat.util.compat.Jre9Compat.jarFileNewInstance(Jre9Compat.java:206)
                ... 51 more
        Caused by: java.nio.file.NoSuchFileException: /opt/tomcat/apache-tomcat-9.0.50/lib/jakarta.annotation-api.jar
                at java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:92)

WARNING: Failed to scan [file:/opt/tomcat/apache-tomcat-9.0.50/lib/woodstox-core.jar] from classloader hierarchy
java.io.IOException: java.lang.reflect.InvocationTargetException
Caused by: java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.GeneratedConstructorAccessor7.newInstance(Unknown Source)
        at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
        at org.apache.tomcat.util.compat.Jre9Compat.jarFileNewInstance(Jre9Compat.java:206)
        ... 49 more
Caused by: java.nio.file.NoSuchFileException: /opt/tomcat/apache-tomcat-9.0.50/lib/woodstox-core.jar
        at java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:92)

还有很多很多。在/opt/tomcat/apache-tomcat-9.0.50/lib 我有罐子,但不是jakarta.annotation-api.jar,而是-rwxr-x--- 1 root root 25K sie 2 16:49 jakarta.annotation-api-1.3.5.jar。我认为这就是问题所在 - 它正在寻找没有版本的罐子,但我不知道为什么。如何强制 tomcat 使用正确的 jars?

【问题讨论】:

    标签: java tomcat jakarta-ee cxf java-11


    【解决方案1】:

    检查catalina.properties 中的*.loader 属性,看看您是否没有对这些网址进行硬编码。默认情况下,只有 common.loader 属性设置为非空值:

    common.loader="${catalina.base}/lib","${catalina.base}/lib/*.jar","${catalina.home}/lib","${catalina.home}/lib/*.jar"
    

    这些消息的另一个来源可能是清单扫描功能(参见source code),它还会扫描另一个 JAR 文件清单中提到的同一文件夹中的 JAR 文件。要检查是否是这种情况,请运行:

    for jar in /opt/tomcat/apache-tomcat-9.0.50/lib/*.jar; do
        unzip -p "$jar" META-INF/MANIFEST.MF | grep '^Class-Path';
    done
    

    要解决此问题,您可以通过添加 $CATALINA_BASE/conf/context.xml 来完全禁用清单扫描:

    <Context>
      ...
      <JarScanner scanManifest="false"/>
      ...
    </Context>
    

    (参见Tomcat's documentation

    备注:除非您以root 运行Tomcat,否则您的权限会阻止任何其他用户读取这些JAR 文件。您至少应该为运行 Tomcat 的用户添加读取 (r) 权限。

    【讨论】:

    • 我的common.loader 与您粘贴的完全相同。
    • @Michu93:另一种可能性是您在 lib 文件夹中的 JAR 文件在其清单中提到了那些不存在的 JAR。我相应地编辑了问题。
    • 这与 tomcat/lib 问题有关 - 我只是注意到当我这样做时:rm jaxws-rt-2.3.4.jar in tomcat/lib 然后 catalina.out 中的错误消失了或者更像是改变了 - 现在我可以看到 @ 987654338@ jar 不再在日志中,但现在 WARNING: Failed to scan [file:/opt/tomcat/apache-tomcat-9.0.50/lib/hk2.jar] from classloader hierarchy 所以它必须与我正在使用的库相关;/
    • jaxws-rt 工件在其清单中具有:Class-Path: jakarta.annotation-api.jar jakarta.activation.jar jakarta.mail.jar jakarta.jws-api.jar jakarta.xml.bind-api.jar jakarta.xml.ws-api.jar jakarta.xml.soap-api.jar FastInfoset.jar gmbal-api-only.jar ha-api.jar jaxb-impl.jar management-api.jar mimepull.jar policy.jar saaj-impl.jar stax-ex.jar stax2-api.jar streambuffer.jar woodstox-core.jar,因此所有这些警告。在修改后的答案中禁用清单扫描或重命名 JAR 文件。
    • 另一种解决方案是 exclude from pom.xml all those jakarta.* from jaxws-rt
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    • 2017-09-17
    • 1970-01-01
    • 2011-08-31
    • 2012-06-10
    相关资源
    最近更新 更多