web-dev-qa-db-fra.com

Tomcat 7 - Servlet 3.0: Balise d'octet non valide dans un pool constant

  • Tomcat 7.0.16 
  • Java 1.6.0_22 
  • CentOS 5.6

Je viens de passer du fichier web.xml à la servlet 3.0 (à partir d'une application fonctionnant sous la version 2.4 précédemment) et l'erreur suivante s'affiche (l'activation de la journalisation précise pour org.Apache.Tomcat.util):

mtyson  FINE: Scanning JAR [file:/usr/Java/jdk1.6.0_22/jre/lib/ext/jcharset.jar] from classpath
mtyson  Jul 19, 2011 10:04:40 AM org.Apache.catalina.startup.HostConfig deployDirectory
mtyson  SEVERE: Error deploying web application directory ROOT
mtyson  org.Apache.Tomcat.util.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 60

MISE À JOUR: Just Tried Tomcat 7.0.19 - mêmes résultats

26
mtyson

Ce n'est peut-être pas votre problème, mais le mien était le identique à celui-ci - une ancienne version de com.ibm.icu:icu4j. J'ai résolu le problème en changeant la configuration de construction pour exclure les anciennes dépendances transitives et explicitement en fonction de la dernière version (4.8). 

23
James A Wilson

Ajouter 

metadata-complete="true" 

à votre web.xml devrait trier le problème

<web-app version="3.0"
         xmlns="http://Java.Sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee http://Java.Sun.com/xml/ns/javaee/web-app_3_0.xsd"
         metadata-complete="true">

Ceci indique à Tomcat de ne pas analyser les classes pour les annotations: http://www.tomcatexpert.com/blog/2011/10/12/how-use-fragments-and-annotations-configure-your-web-application

29
KeithM

Merci James A Wilson pour votre réponse - mettre à jour icu4j comme vous l’avez suggéré fonctionne pour moi et me permet de conserver la version = "3.0" dans mon web.xml (que je préfère à long terme).

icu4j 2.6.1 était la version qui ne fonctionnait pas, la mise à niveau vers la version 3.4.4 de NEXT résoudra ce problème. Je ne suis PAS allé à la dernière version de icu4j (49.1) car elle est 4 Mo plus grande que la version 3.4.4.

Voici un extrait de configuration Maven pour verrouiller votre version de dépendance transitive (sans ajouter de dépendance explicite):

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.ibm.icu</groupId>
            <artifactId>icu4j</artifactId>
            <version>3.4.4</version>
        </dependency>
    </dependencies>
</dependencyManagement>
19
Steve Jones

Je suis tombé sur le même problème aujourd'hui. Dans mon cas, la dépendance venait via com.google.code.findbugs: annotations: jar: 1.3.8. Cela signifie que cette bibliothèque n’est utilisée que lors de la construction, pour utiliser des annotations afin de désactiver certains avertissements de findbug. Dans ce cas, au lieu de changer de version, il est prudent de modifier simplement la portée de la dépendance et de ne pas prendre la bibliothèque au moment de l'exécution:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.ibm.icu</groupId>
            <artifactId>icu4j</artifactId>
            <scope>provided</scope>
        </dependency>
        ....
3
Assen Kolov

Cela s'est avéré être un fichier jasper incompatible inclus dans la construction, en conflit avec le fichier jasper.jar dans Tomcat 7.

2
mtyson

Je pense que c'est un bogue lors de l'analyse du fichier web.xml

En utilisant cela fonctionne pour moi ...

<web-app version="2.5" xmlns="http://Java.Sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee http://Java.Sun.com/xml/ns/javaee/web-app_3_0.xsd">

<session-config> <tracking-mode>COOKIE</tracking-mode> </session-config>

Notez l'utilisation de la version = "2.5" avec le schéma web-app_3_0.xsd et la présence du mode de suivi session-config qui n'est qu'une partie de la spécification 3.0 et non de la version 2.5 (autant que je sache)

2
Mark

Je faisais face au même problème depuis une semaine et je l'ai résolu en remplaçant simplement le fichier icu4j.2.1.jar par la dernière version de jar.

1
Ashish Malhotra

Résolu en supprimant le dossier et en téléchargeant à nouveau les fichiers jar

0
Dez Udezue

Dans la version 2.6.1. com.ibm.icu.impl.data.LocaleElements_zh__PINYIN.class n'est pas valide. La seule solution est de mettre à jour, d'autres solutions ne sont que des solutions de contournement.

Pour le vérifier, exécutez le test suivant dans votre projet (à condition que icu-x.x.x.jar se trouve sur votre chemin de classe):

@Test public void testValidityOfLocaleElements_zh__PINYINJar() throws ClassNotFoundException { getClass().forName("com.ibm.icu.impl.data.LocaleElements_zh__PINYIN"); }

0
Michiel Rop

Nous avions commencé à avoir la même erreur avec une modification mineure de notre application sans aucune mise à niveau vers Java, Tomcat ou des dépendances de projet. Nous avons icu4j 2.6.1

Après avoir passé beaucoup de temps et essayé de mettre à jour icu4j vers diverses versions plus récentes (nous avons remarqué et constaté que les versions d'icu passaient de la version 4.8.x à la version 49.xx, 50.xx, etc. ), nous avons trouvé le problème.

Notre modification mineure a soumis une nouvelle classe (classe A) mappée en veille prolongée. Hibernate s’initialise au démarrage du fichier WAR et vérifie la correspondance entre les objets persistants et leurs mappages. Une autre classe est une énumération (classe B) portant le même nom et le même package dans notre base de code. Une fois que nous avons corrigé cette classe en double, le problème a disparu.

0
Ahmet Emre