Tomcat 7生产服务器上的VerifyError可能是由Apache Commons Logging 1.0.4引起的

Pře*_*tný 21 java apache-commons apache-fop tomcat7

我在Tomcat 7上开发webapp.在我的本地版本的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)
Run Code Online (Sandbox Code Playgroud)

当我尝试FopFactory.newInstance();(来自Apache FOP 1.0)时抛出错误.之后,它试图LogFactory.getLog(FopFactory.class);.它logClass.getConstructor(logConstructorSignature);被称为,其中logConstructorSignature包含一个String.class.(至少在我的本地机器上)

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

在此之后调用java.lang.Class函数并抛出异常.您有任何想法,为什么错误只会在生产服务器上抛出,而不是在本地计算机上抛出?

Sky*_*ker 3

为什么会出现这个错误(java.lang.VerifyError)?

当您针对与运行时(在生产服务器中)使用的库不同的库进行编译时,将出现java.lang.VerifyError错误。

建议#1:

您可以使用commons-logging-1.1.1.jar代替commons-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>
Run Code Online (Sandbox Code Playgroud)

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

<dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.0.4</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

资源链接: 获取 java.lang.ClassNotFoundException:org.apache.commons.logging.LogFactory 异常

建议#3:

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

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

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

资源链接: /sf/answers/378806991/

建议#4:

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

资源链接: 出现 java.lang.VerifyError 的原因

希望它能帮助你。