it-swarm.com.ru

org.Apache.Tomcat.util.bcel.classfile.ClassFormatException: недопустимый байт-тег в пуле констант: 15

Я портирую веб-приложение с Tomcat 7 на другой сервер с Tomcat 7, но с Java 8.

Tomcat запускается успешно, но в журнале catalina.out я получаю:

org.Apache.Tomcat.util.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 15
    at org.Apache.Tomcat.util.bcel.classfile.Constant.readConstant(Constant.Java:131)
    at org.Apache.Tomcat.util.bcel.classfile.ConstantPool.<init>(ConstantPool.Java:60)
    at org.Apache.Tomcat.util.bcel.classfile.ClassParser.readConstantPool(ClassParser.Java:209)
    at org.Apache.Tomcat.util.bcel.classfile.ClassParser.parse(ClassParser.Java:119)
    at org.Apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.Java:2049)
    at org.Apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.Java:1931)
    at org.Apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.Java:1899)
    at org.Apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.Java:1885)
    at org.Apache.catalina.startup.ContextConfig.webConfig(ContextConfig.Java:1281)
    at org.Apache.catalina.startup.ContextConfig.configureStart(ContextConfig.Java:855)
    at org.Apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.Java:346)
    at org.Apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.Java:119)
    at org.Apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.Java:90)
    at org.Apache.catalina.core.StandardContext.startInternal(StandardContext.Java:5172)
    at org.Apache.catalina.util.LifecycleBase.start(LifecycleBase.Java:150)
    at org.Apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.Java:899)
    at org.Apache.catalina.core.ContainerBase.addChild(ContainerBase.Java:875)
    at org.Apache.catalina.core.StandardHost.addChild(StandardHost.Java:618)
    at org.Apache.catalina.startup.HostConfig.deployDirectory(HostConfig.Java:1100)
    at org.Apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.Java:1618)
    at Java.util.concurrent.Executors$RunnableAdapter.call(Executors.Java:511)
    at Java.util.concurrent.FutureTask.run(FutureTask.Java:266)
    at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1142)
    at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:617)
    at Java.lang.Thread.run(Thread.Java:745)

В чем может быть проблема?

57
JackTurky

«Официальный ответ» заключается в том, что Tomcat 7 работает на Java 8, см http://Tomcat.Apache.org/whichversion.html («Java версии 6 и новее»).

Однако, если включено сканирование аннотаций (metadata-complete = "true" в web.xml), возникают некоторые проблемы из-за BCEL (не удается обработать новые 8-байтовые коды Java). Вы получите исключения вроде (по крайней мере, с Tomcat 7.0.28):

SEVERE: Unable to process Jar entry [jdk/nashorn/internal/objects/NativeString.class] from Jar [jar:file:/usr/lib/jvm/jdk1.8.0_5/jre/lib/ext/nashorn.jar!/] for annotations
org.Apache.Tomcat.util.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 15
    at org.Apache.Tomcat.util.bcel.classfile.Constant.readConstant(Constant.Java:131)

Если not использует сканирование аннотаций, все работает нормально, начиная с версии 7.0.53 (обновленный компилятор с улучшенной поддержкой Java 8).

(ОБНОВЛЕНИЕ 2014-10-17) Если ваш использует сканирование аннотаций и ваш собственный код не основан на Java 8, другое решение заключается в добавлении следующей строки в /etc/Tomcat7/catalina.properties (текст, добавленный после " ant-launcher.jar "so часть свойства Tomcat.util.scan.DefaultJarScanner.jarsToSkip):

junit.jar,junit-*.jar,ant-launcher.jar,\
jfxrt.jar,nashorn.jar

Протестировано с Tomcat 7.0.28 и Oracle JDK 8_25 в Debian 7.6.

64
rmuller

Это была ошибка Tomcat , которая снова всплыла с байт-кодом Java 9. Точные версии, которые исправляют это (для байт-кода Java 8/9):

  • ствол для 9.0.0.M18 года
  • 8.5.x для 8.5.12 и далее
  • 8.0.x для 8.0.42 и далее
  • 7.0.x для 7.0.76 и далее
11
vallismortis

Обновление до Tomcat 7.0.58 (или новее).

Смотрите: https://bz.Apache.org/bugzilla/show_bug.cgi?id=57173#c16

9
Saulo Silva

Эта проблема возникает из-за того, что вы установили jre1.8.0_101-1.8.0_101-fcs.i58.rpm, а также jdk-1.7.0_80-fcs.x86_64.rpm. так что просто удалите свой jre rpm и перезапустите приложение. Это должно сработать.

2
C Karthickeyan

Для меня обновление bcel до 6.0 решило проблему.

1
Cody

Для меня это сработало, сняв эти банки с войны. С Maven мне просто пришлось исключить например

    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jaxb-provider</artifactId>
        <version>${resteasy.version}</version>
        <exclusions>
            <exclusion>
                <groupId>com.Sun.istack</groupId>
                <artifactId>istack-commons-runtime</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.jvnet.staxex</groupId>
                <artifactId>stax-ex</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.glassfish.jaxb</groupId>
                <artifactId>txw2</artifactId>
            </exclusion>
            <exclusion>
                <groupId>com.Sun.xml.fastinfoset</groupId>
                <artifactId>FastInfoset</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
0
Andreas Panagiotidis

Я получил похожую ошибку (org.aspectj.Apache.bcel.classfile.ClassFormatException: недопустимый байт-тег в пуле констант: 15) при использовании aspectj 1.8.13. Решение состояло в том, чтобы выровнять всю компиляцию в jdk 8 и быть осторожным, чтобы не помещать другие версии библиотеки aspectj (1.6.13) в buildpath/classpath.

0
yılmaz

Я столкнулся с этой проблемой с Tomcat 7 + JDK 1,8

с Java 1.7 и более поздними версиями все работает нормально.

окно -> настройки -> Java -> установленная jre 

в моем случае я изменил jre1.8 на JDK 1.7 

и соответственно измените фасет проекта, выберите ту же версию Java, которая есть в выбранной Установленной JRE.

0
Neelam Chahal