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?

JackTurky
fuente
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.

rmuller
fuente
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
vallismortis
fuente
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
8

Actualice a Tomcat 7.0.58 (o más reciente).

Ver: https://bz.apache.org/bugzilla/show_bug.cgi?id=57173#c16

La mejora de rendimiento que desencadenó esta regresión se ha revertido desde el tronco, 8.0.x (para 8.0.16 en adelante) y 7.0.x (para 7.0.58 en adelante) y no se volverá a aplicar.

Saulo Silva
fuente
2
No encontré ninguna relación con Java 8 en este enlace.
Michael_S
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.

C Karthickeyan
fuente
1

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

Cody
fuente
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>
Andreas Panagiotidis
fuente
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.

K. Andy Wang
fuente
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.

Neelam Chahal
fuente
@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.

yılmaz
fuente
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>
ozkansari
fuente