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

Я разрабатываю веб-приложение на 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 и выдается исключение. Вы хоть представляете, почему ошибка возникает только на рабочем сервере, а не на моем локальном компьютере?


person Přemysl Šťastný    schedule 03.03.2017    source источник
comment
Похоже, какая-то проблема с разницей в версии общего журнала между вашим локальным и продуктом env. Как вы развертываете свое приложение?   -  person Evgeny Veretennikov    schedule 06.03.2017
comment
@ evere10 Отправив пакет war в Tomcat Web Application Manager. Как это возможно?   -  person Přemysl Šťastný    schedule 06.03.2017


Ответы (2)


Почему возникает эта ошибка (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-файлы и исходные файлы.

Ссылка на ресурс: https://stackoverflow.com/a/5411528/2293534

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

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

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

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

person SkyWalker    schedule 08.03.2017
comment
Не знаю почему, но проблема была решена, когда я преобразовал его в проект maven и установил зависимости. Спасибо. - person Přemysl Šťastný; 08.03.2017

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

Если вы хотите попробовать воспроизвести локально, скопируйте набор jar-файлов из производственного каталога lib в вашу локальную установку.

person M. Rizzo    schedule 06.03.2017