Tomcat 7 生产服务器上的验证错误可能是由 Apache Commons Logging 1.0.4 引起的

2022-09-02 04:49:59

我正在Tomcat 7上开发Web应用程序。在我的本地版本的Tomcat上一切正常,但是当我在生产服务器上部署它时,它会引发此异常。

java.lang.VerifyError: (class: org/apache/commons/logging/impl/Log4JLogger, method: fatal signature: (Ljava/lang/Object;Ljava/lang/Throwable;)V) Incompatible object argument for function call
    at java.lang.Class.getDeclaredConstructors0(Native Method)
    at java.lang.Class.privateGetDeclaredConstructors(Class.java:2595)
    at java.lang.Class.getConstructor0(Class.java:2895)
    at java.lang.Class.getConstructor(Class.java:1731)
    at org.apache.commons.logging.impl.LogFactoryImpl.getLogConstructor(LogFactoryImpl.java:410)
    at org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:529)
    at org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:235)
    at org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:209)
    at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:351)
    at org.apache.fop.apps.FopFactory.<clinit>(FopFactory.java:68)
    at cz.soma.tomcat.generator.DokumentaceUtils.createPdfDocument(DokumentaceUtils.java:818)
    at cz.soma.tomcat.generator.FileFactory.createPdfDocument(FileFactory.java:58)
    at cz.soma.tomcat.generator.Generator.doPost(Generator.java:111)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)

当我尝试(从Apache FOP 1.0)时,会引发错误。之后,它会尝试 .它会导致(即调用)其中 logConstructorSignature 包含一个 String.class。(至少在我的本地计算机上)FopFactory.newInstance();LogFactory.getLog(FopFactory.class);logClass.getConstructor(logConstructorSignature);

try {
    logConstructor = logClass.getConstructor(logConstructorSignature);
    return (logConstructor);
} catch (Throwable t) {
    throw new LogConfigurationException
        ("No suitable Log constructor " +
         logConstructorSignature+ " for " + logClassName, t);
}

在此之后称为java.lang.Class函数并引发异常。你有没有想过,为什么错误只抛在生产服务器上,而不是在我的本地计算机上?


答案 1

为什么会发生此错误(java.lang.VerifyError)?

java.lang.VerifyError 将是针对与运行时(在生产服务器中)使用的不同库进行编译的结果。

建议#1:

您可以使用 代替 。然后重新生成项目并进行检查。commons-logging-1.1.1.jarcommons-logging-1.0.4.jar

资源链接:http://www.java-samples.com/showtutorial.php?tutorialid=674

建议#2:

如果您使用的是maven,那么请在您的pom中添加此依赖项.xml,

<dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.1.1</version>
</dependency>

并从您的 pom 中删除以下依赖项.xml

<dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.0.4</version>
</dependency>

Resource Link: Getting java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory exception

建议#3:

templatetypedef已经挖掘了问题,并给出了2个解决方案

验证错误通常意味着您加载的类文件以某种方式格式不正确,或者引用了另一个类文件,该文件已更改,从而导致另一个类文件中的代码不再有效。例如,如果您编译了一个类文件,该文件引用了其他类中的方法,然后在更改该方法的签名后独立修改并重新编译了第二个类,则会出现此类错误。

我建议做一个干净的构建,看看这个问题是否消失。如果没有,请检查您是否正在使用最新的 JAR 和源文件。

资源链接:https://stackoverflow.com/a/5411528/2293534

建议#4:

如果您的 JDK 版本在本地服务器和生产服务器之间不匹配,请尽可能使其相同。您也可以尝试使用不同的 JDK 版本和不同的计算机进行编译。

资源链接:获取 java.lang.VerifyError 的原因

希望它能帮助你。


答案 2

您可能在生产 Tomcat 服务器上的公共 lib 目录中有不同版本的日志记录 jar。让某人检查 \lib 目录,并查看 lib 目录中是否有任何日志记录 jar。删除这些 jar 以便使用本地应用 jar,或者确保在应用程序中定义了相同版本的依赖项。

如果要尝试在本地复制,请将生产 lib 目录中的 jar 集复制到本地安装。


推荐