java - invalid byte tag in constant pool: 19
org.apache.tomcat.util.bcel.classfile.ClassFormatException: etiqueta de bytes no vĂ¡lida en el grupo constante: 15 (6)
Estoy portando una aplicación web de Tomcat 7 a otro servidor con Tomcat 7 pero con Java 8.
Tomcat comienza con éxito pero en el registro catalina.out
obtengo:
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?
Actualiza a Tomcat 7.0.58 (o más reciente).
Ver: https://bz.apache.org/bugzilla/show_bug.cgi?id=57173#c16
Enfrenté este problema con tomcat 7 + jdk 1.8
con Java 1.7 y versiones más bajas 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á allí en el JRE instalado seleccionado.
Este fue un error de Tomcat que resurgió de nuevo con el bytecode de Java 9. Las versiones exactas que corrigen esto (para ambos bytecode 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
Este problema está sucediendo 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 solo desinstale su jre rpm y reinicie su aplicación. Debería funcionar.
La "respuesta oficial" es que Tomcat 7 se ejecuta en Java 8, consulte http://tomcat.apache.org/whichversion.html ("Java versión 6 y posterior").
Sin embargo, si el análisis de anotación está habilitado (metadata-complete = "true" en web.xml), existen algunos problemas debido a BCEL (no se pueden procesar los nuevos códigos de Java 8 byte). Obtendrás 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 se utiliza el análisis de anotaciones, todo funciona bien, comenzando con la versión 7.0.53 (compilador actualizado con mejor soporte de Java 8).
(ACTUALIZACIÓN 2014-10-17) Si utiliza el análisis de anotación y su propio código no está basado en Java 8, otra solución es agregar la siguiente línea en /etc/tomcat7/catalina.properties
(texto agregado después de "ant-launcher". jar "tan 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.
Para mí, la actualización de bcel a 6.0 solucionó el problema.