2010-06-12 5 views
6

Ich erstelle ein CLI-Tool, um eine vorhandene Anwendung zu verwalten. Sowohl die Anwendung und die Tests bauen fein und gut laufen aber trotzdem erhalte ich einen Javassist Fehler, wenn mein cli Werkzeug ausgeführt wird, der in dem Glas vorhanden ist:Javassist Fehler im Ruhezustand: ungültige Konstante Typ: 60

INFO: Bytecode provider name : javassist 
... 
INFO: Hibernate EntityManager 3.5.1-Final 
Exception in thread "main" javax.persistence.PersistenceException: Unable to configure EntityManagerFactory 
     at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:371) 
     at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:55) 
     at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:48) 
     at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:32) 
     ... 
     at com.sophware.flexipol.admin.AdminTool.<init>(AdminTool.java:40) 
     at com.sophware.flexipol.admin.AdminTool.main(AdminTool.java:69) 
Caused by: java.lang.RuntimeException: Error while reading file:flexipol-jar-with-dependencies.jar 
     at org.hibernate.ejb.packaging.NativeScanner.getClassesInJar(NativeScanner.java:131) 
     at org.hibernate.ejb.Ejb3Configuration.addScannedEntries(Ejb3Configuration.java:467) 
     at org.hibernate.ejb.Ejb3Configuration.addMetadataFromScan(Ejb3Configuration.java:457) 
     at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:347) 
     ... 11 more 
Caused by: java.io.IOException: invalid constant type: 60 
     at javassist.bytecode.ConstPool.readOne(ConstPool.java:1027) 
     at javassist.bytecode.ConstPool.read(ConstPool.java:970) 
     at javassist.bytecode.ConstPool.<init>(ConstPool.java:127) 
     at javassist.bytecode.ClassFile.read(ClassFile.java:693) 
     at javassist.bytecode.ClassFile.<init>(ClassFile.java:85) 
     at org.hibernate.ejb.packaging.AbstractJarVisitor.checkAnnotationMatching(AbstractJarVisitor.java:243) 
     at org.hibernate.ejb.packaging.AbstractJarVisitor.executeJavaElementFilter(AbstractJarVisitor.java:209) 
     at org.hibernate.ejb.packaging.AbstractJarVisitor.addElement(AbstractJarVisitor.java:170) 
     at org.hibernate.ejb.packaging.FileZippedJarVisitor.doProcessElements(FileZippedJarVisitor.java:119) 
     at org.hibernate.ejb.packaging.AbstractJarVisitor.getMatchingEntries(AbstractJarVisitor.java:146) 
     at org.hibernate.ejb.packaging.NativeScanner.getClassesInJar(NativeScanner.java:128) 
     ... 14 more 

Da weiß ich, das Glas ist in Ordnung, wie die Einheit und Integrationstests laufe dagegen, ich dachte es könnte ein Problem mit Javassist sein, also habe ich cglib ausprobiert. Der Bytecode-Provider zeigt dann als cglib, aber ich bekomme immer noch die exakt gleiche Stack-Trace mit javassist drin.

cglib ist auf jeden Fall in der Classpath:

$ unzip -l flexipol-jar-with-dependencies.jar | grep cglib | wc -l 
383 

Ich habe mit versucht, sowohl dem Ruhezustand 3.4 und 3.5 und die exakt gleichen Fehler. Ist das ein Problem mit Javassist?

AKTUALISIEREN: Ich kann die Anwendung innerhalb von Eclipse erfolgreich ausführen (Rechtsklick-> Ausführen als-> Java-Anwendung), aber die Maven-generierte jar-with-dependencies schlägt fehl. Ich nehme an, der Unterschied besteht darin, dass javassist bei Eclipse das enthaltene jar nicht prüft, sondern alle Klassendateien (und vielleicht einige davon abhängige 3rd-party jars) überprüft.

Antwort

19

Das Problem wird letztlich durch eine ungültige Klasse in icu4j-2.6.1 verursacht, wie in this post zu sehen ist. Insbesondere ist diese Datei ungültig:

com/ibm/icu/impl/data/LocaleElements_zh__PINYIN.class 

Hier ist eine einfache Möglichkeit, eine beschädigte Datei zu identifizieren:

for x in PATH_TO_EXTRACTED_JAR/**/*.class; do 
    java -cp PATH_TO/javassist.jar javassist.tools.Dump $x >/dev/null 2>&1 || echo "$x is invalid" 
done 

Diese Datei wird von indirekt von Maven durch seine transitiven Abhängigkeiten einbezogen werden, weshalb ich didn‘ Ich erkenne diese Seite als Verweis auf den Fehler und eine Datei im Jar als Ursache und Ursache des Problems. Hier ist, wie es oben endete in meinem Glas-mit-Abhängigkeiten Bundle enthalten:

jaxen-1.1.1 -> xom-1.0 -> icu4j-2.6.1 

Nach dem Hinzufügen der folgenden Ausschluss der jaxen Abhängigkeit, alles richtig funktionierte für mich (aber seien Sie vorsichtig, wenn Sie seine Lokalisierung Stücke benötigen):

<exclusions> 
    <exclusion> 
     <groupId>com.ibm.icu</groupId> 
     <artifactId>icu4j</artifactId> 
    </exclusion> 
</exclusions> 

wäre eine weitere Option, um die problematische Datei (en) aus der jAR-Datei zu entfernen:

#!/bin/sh                                                          
shopt -s extglob 
shopt -s globstar 
for x in **/*.jar ; do 
    zip -d $x 'com/ibm/icu/impl/data/*_zh*' >/dev/null 2>&1 && echo "Removed corrupted files from $x" 
done 
+0

vergessen Sie nicht 'shopt -s globstar' vor dem Scancode hinzufügen an der Spitze des Beitrags. –