Подтвердить что ты не робот

VerifyError на сервере производства Tomcat 7, вероятно, вызван Apache Commons Logging 1.0.4

Я разрабатываю webapp на Tomcat 7. Все работает отлично в моей локальной версии 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)

Ошибка возникает при попытке 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);
}

После этого вызываются функции java.lang.Class и исключение. Есть ли у вас какие-либо идеи, почему ошибка вызывается только на рабочем сервере, но не на моей локальной машине?

4b9b3361

Ответ 1

Почему возникает эта ошибка (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>

и удалите следующую зависимость из вашего pom.xml

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

Ссылка ресурса: Получение java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory исключение

Предложение # 3:

templatetypedef выкопал проблему и дал 2 решения

VerifyError обычно означает, что вы загрузились в файл класса, который каким-либо образом искаженным или который ссылается на другой файл класса, который имеет изменено таким образом, чтобы код в другом файле класса более долговечны. Например, если вы скомпилировали файл класса, который ссылается на метод в каком-то другом классе, затем независимо модифицируется и перекомпилировал второй класс после изменения этого метода подпись, вы получите такую ​​ошибку.

Я предлагаю сделать чистую сборку и посмотреть, не исчезнет ли эта проблема. Если не проверяйте, используете ли вы современные JAR файлы и исходные файлы.

Ссылка ресурса: fooobar.com/questions/252482/...

Предложение # 4:

Если ваша версия JDK несовместима между локальным и производственным серверами, тогда сделайте ее одинаковой, если это возможно. Вы также можете попробовать выполнить компиляцию с другой версией JDK и на другой машине.

Ссылка ресурса: Причины получения java.lang.VerifyError

Надеюсь, это поможет вам.

Ответ 2

Вероятно, у вас, вероятно, другая версия журнальных банок в общем каталоге lib на сервере Tomcat. Попросите кого-нибудь проверить каталог \lib и посмотреть, есть ли в каталоге lib журналы регистрации. Либо удалите эти банки, чтобы ваши локальные банки приложений были использованы, либо убедитесь, что в вашем приложении определена одна и та же версия зависимостей.

Если вы хотите попытаться воспроизвести локальную репликацию набора jars в каталоге production lib для вашей локальной установки.