web-dev-qa-db-fra.com

org.Apache.Tomcat.util.bcel.classfile.ClassFormatException: balise d'octet non valide dans le pool constant: 15 - Tomcat 7, incompatibilité JDK?

J'ai essayé de passer à Java 8. Lors du démarrage de notre serveur Tomcat7, avec un fichier .war compilé Java 7), j'obtiens l'erreur mystérieuse ci-dessous.

Dois-je m'attendre à ce que cela fonctionne? Ce post indique que Tomcat 7 devrait fonctionner avec 1.6 et plus. Je ne peux pas dire si Tomcat est à blâmer, ou le .war. Changer les différentes versions de Java que j'obtiens:

  • JDK 7.45 installé - fonctionne (même version utilisée pour compiler .war)
  • JDK 7.55 installé - échoue comme ci-dessous
  • JDK 8.05 installé - échoue comme ci-dessous

Tomcat est-il à blâmer, ou le .war?

Caused by: 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:2032)
        at org.Apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.Java:1923)
        at org.Apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.Java:1891)
        at org.Apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.Java:1877)
        at org.Apache.catalina.startup.ContextConfig.webConfig(ContextConfig.Java:1270)
        at org.Apache.catalina.startup.ContextConfig.configureStart(ContextConfig.Java:855)
        at org.Apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.Java:345)
        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:5161)
        at org.Apache.catalina.util.LifecycleBase.start(LifecycleBase.Java:150)
24
user48956

Je voyais cette erreur avec Tomcat 7.0.26.

Pour répondre à votre question, Tomcat est à blâmer: https://issues.Apache.org/bugzilla/show_bug.cgi?id=53735

La mise à niveau vers la version 7.0.53 l'a corrigé pour moi (selon le problème lié, le correctif devrait être dans 7.0.30 et versions ultérieures).

30
Bernie

J'avais Java 8 sur mon ordinateur, mais je voulais exécuter mon Tomcat utilisant Java 7 .

La solution suivante a fonctionné pour moi.

Dans %CATALINA_HOME%\bin\ (Par exemple: C:\Tomcat\bin) add setenv.bat ayant le contenu suivant:

@echo off
set Java_HOME=C:\Program Files\Java\jdk1.7.0_03
set JRE_HOME=%Java_HOME%\jre
exit /B 0

Lorsque vous exécutez startup.bat, les appels suivants se produisent:

startup.bat
     |
     └── catalina.bat
               |
               └── setenv.bat
  • voir:

    if not exist "%CATALINA_BASE%\bin\setenv.bat" goto checkSetenvHome
    call "%CATALINA_BASE%\bin\setenv.bat"
    
0
ROMANIA_engineer

J'ai également rencontré ce problème. J'ai suivi l'erreur et j'ai découvert que je devais mettre à niveau vers la dernière version notre dépendance maven pour le pot ICU4J.

Et l'erreur a disparu maintenant:

  <dependency>
     <groupId>com.ibm.icu</groupId>
     <artifactId>icu4j</artifactId>
     <version>56.1</version>
  </dependency>
0
Jeet