org.apache.tomcat.util.bcel.classfile.ClassFormatException: etiqueta de byte no válida en el grupo constante: 15


81

Estoy portando una aplicación web de Tomcat 7 a otro servidor con Tomcat 7 pero con Java 8.

Tomcat se inicia correctamente pero en el registro catalina.outobtengo:

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)

¿Cual podría ser el problema?


Necesita AspectJ 1.8 para obtener compatibilidad con Java 8. stackoverflow.com/questions/23801950/…
Anant Laxmikant Bobde

@AnantLaxmikantBobde Eso no está relacionado con la causa de este problema, que es una incompatibilidad de código de bytes entre esa versión específica de Tomcat y esa versión del JDK. Consulte esta respuesta para obtener la solución correcta.
vallismortis

Respuestas:


86

La "respuesta oficial" es que Tomcat 7 se ejecuta en Java 8, consulte http://tomcat.apache.org/whichversion.html ("Java versión 6 y posteriores").

Sin embargo, si el escaneo de anotaciones está habilitado (metadata-complete = "true" en web.xml), existen algunos problemas debido a BCEL (no se pueden procesar los nuevos códigos de bytes de Java 8). Obtendrá excepciones como (al menos con 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)

Si no utiliza el escaneo de anotaciones, todo funciona bien, a partir de la versión 7.0.53 (compilador actualizado con mejor compatibilidad con Java 8).

(ACTUALIZACIÓN 2014-10-17) Si está utilizando el escaneo de anotaciones y su propio código no está basado en Java 8, otra solución es agregar la siguiente línea /etc/tomcat7/catalina.properties(texto agregado después de "ant-launcher.jar", por lo que forma parte de la propiedad tomcat.util.scan.DefaultJarScanner.jarsToSkip):

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

Probado con Tomcat 7.0.28 y Oracle JDK 8_25 en Debian 7.6.


Tomcat 7.054 todavía no es compatible con el indicador jdk8 -compiler, pregunta relacionada en stackoverflow.com/questions/25279729/…
Gerrit Brink

1
Para aclarar: si metadata-complete = "true" está en web.xml, el procesamiento de anotaciones debería estar deshabilitado, ¿verdad?
Christian K.

Probablemente, el comentario esté desactualizado, pero cambiar el Tomcat de 7.0.23 a 8.0.18 me resuelve automáticamente el problema [Windows 7]
Yauhen

Modificar tomcat.util.scan.DefaultJarScanner.jarsToSkip dentro de catalina.properties funcionó para Tomcat 8 para mí. (¡Al menos reveló otros problemas!)
JGFMK

1
@SamuelThompson Vea esta respuesta para la solución correcta para Tomcat 8.
vallismortis

28

Este fue un error de Tomcat que resurgió nuevamente con el código de bytes de Java 9. Las versiones exactas que solucionan esto (para ambos códigos de bytes de Java 8/9) son:

  • tronco para 9.0.0.M18 en adelante
  • 8.5.x para 8.5.12 en adelante
  • 8.0.x para 8.0.42 en adelante
  • 7.0.x para 7.0.76 en adelante

2
Esto me resolvió el problema (falló el JDK 8 con Tomcat 8.0.27)
pablo

1
Tengo este problema con tomcat 8.0.36 y log4j-api-2.11.0.jar
stephan f

2
Esto resolvió el problema. Actualice su versión de Tomcat
LFelix


2

Este problema ocurre porque ha instalado jre1.8.0_101-1.8.0_101-fcs.i58.rpm y jdk-1.7.0_80-fcs.x86_64.rpm. así que simplemente desinstale su jre rpm y reinicie su aplicación. Debería funcionar.


1

Para mí, actualizar bcel a 6.0 solucionó el problema.


1

Para mí funcionó, al sacar los frascos en cuestión de la guerra. Con Maven, solo tenía que excluir, por ejemplo

    <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>

1
Unable to process Jar entry [module-info.class] from Jar [jar:file:/xxxxxxxx/lombok-1.18.4.jar!/] for annotations
org.apache.tomcat.util.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 19

1.Actualice y agregue el siguiente argumento en <root or instance tomcat folder>/conf/catalina.properties

org.apache.catalina.startup.ContextConfig.jarsToSkip=...,lombok-1.18.4.jar

2.limpiar y desplegar el proyecto futuro.


Tuve que volver a la versión 1.14.8 (AFAIK con las mismas características principales, así que no es gran cosa aquí)
ATorras

0

Me enfrenté a este problema con tomcat 7 + jdk 1.8

con java 1.7 y versiones inferiores está funcionando bien.

ventana -> preferencias -> java -> jre instalado

en mi caso cambié jre1.8 a JDK 1.7

y, en consecuencia, modifique la faceta del proyecto, seleccione la misma versión de Java que está en el JRE instalado seleccionado.


@AshishRatan Vea esta respuesta para la solución correcta para JDK 8.
vallismortis

0

Obtuve un error similar (org.aspectj.apache.bcel.classfile.ClassFormatException: etiqueta de byte no válida en el grupo constante: 15) mientras usaba aspectj 1.8.13. La solución fue alinear toda la compilación en jdk 8 y tener cuidado de no poner otras versiones de la biblioteca de Aspectj (1.6.13 por ejemplo) en buildpath / classpath.


0

Tuve el mismo problema al ejecutar mi aplicación de arranque de primavera con tomcat7: ejecutar

Da error con la siguiente dependencia en maven pom.xml:

    <dependency>
        <groupId>org.junit.vintage</groupId>
        <artifactId>junit-vintage-engine</artifactId>
    </dependency>
SEVERE: Unable to process Jar entry [module-info.class] from Jar [jar:file:/.m2/repository/org/apiguardian/apiguardian-api/1.1.0/apiguardian-api-1.1.0.jar!/] for annotations
org.apache.tomcat.util.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 19

Jul 09, 2020 1:28:09 PM org.apache.catalina.startup.ContextConfig processAnnotationsJar
SEVERE: Unable to process Jar entry [module-info.class] from Jar [jar:file:/.m2/repository/org/apiguardian/apiguardian-api/1.1.0/apiguardian-api-1.1.0.jar!/] for annotations
org.apache.tomcat.util.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 19

Pero cuando lo especifico correctamente en el alcance de la prueba, no da error:

    <dependency>
        <groupId>org.junit.vintage</groupId>
        <artifactId>junit-vintage-engine</artifactId>
        <scope>test</scope>
    </dependency>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.