2010-06-12 12 views
6

मैं मौजूदा एप्लिकेशन को प्रबंधित करने के लिए एक क्ली टूल बना रहा हूं। दोनों आवेदन और परीक्षण ठीक निर्माण और ठीक से चलाने, लेकिन उस के बावजूद मैं एक javassist विफलता को प्राप्त होने वाली मेरी CLI उपकरण है जो जार के भीतर मौजूद चल:हाइबरनेट में जावासिस्ट विफलता: अमान्य निरंतर प्रकार: 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 

के बाद से मैं जानता हूँ कि जार इकाई और एकीकरण परीक्षण के रूप में ठीक है इसके खिलाफ दौड़ो, मैंने सोचा कि यह जावासवादी के साथ एक समस्या हो सकती है, इसलिए मैंने cglib की कोशिश की। बाइटकोड प्रदाता तब cglib के रूप में दिखाता है लेकिन मुझे अभी भी उसमें मौजूद जाववादी के साथ सटीक एक ही स्टैक ट्रेस मिलता है।

cglib classpath में निश्चित रूप से है:

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

मैं दोनों 3.4 और 3.5 हाइबरनेट और ठीक उसी त्रुटि मिलती है साथ की कोशिश की है। क्या यह जावासवादी के साथ एक समस्या है?

अद्यतन: मैं ग्रहण के भीतर सफलतापूर्वक आवेदन चला सकते हैं (सही क्लिक-> चलाएँ जैसे-> जावा आवेदन), लेकिन Maven-उत्पन्न जार-निर्भरता के साथ प्रयोग विफल रहता है। मुझे लगता है कि अंतर यह है कि ग्रहण जावस्त्री युक्त जार का निरीक्षण नहीं कर रहा है, बल्कि, यह सभी वर्ग फ़ाइलों (और शायद कुछ निर्भर तृतीय पक्ष जार) का निरीक्षण कर रहा है।

उत्तर

19

समस्या अंतिम रूप से icu4j-2.6.1 में एक अमान्य वर्ग के कारण होती है जिसे this post में देखा जा सकता है। विशेष रूप से, यह फ़ाइल अमान्य है:

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

यहाँ एक भ्रष्ट फ़ाइल की पहचान करने के लिए एक आसान तरीका है: अपने सकर्मक निर्भरता के माध्यम से Maven द्वारा

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 

इस फ़ाइल में परोक्ष रूप से शामिल किया जा रहा है जिसके कारण मैं नहीं था ' उस पृष्ठ को त्रुटि का संदर्भ देने और जार के भीतर निहित फ़ाइल को अपराधी और समस्या का कारण मानने के रूप में नहीं पहचानता है। यहाँ कैसे यह समाप्त हो गया मेरी जार-साथ-निर्भरता बंडल में शामिल है:

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

jaxen निर्भरता के लिए निम्न बहिष्कार जोड़ने के बाद, सब कुछ मेरे लिए सही ढंग से काम किया (लेकिन अगर आप अपनी स्थानीयकरण टुकड़े की जरूरत है सावधान रहना):

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

एक अन्य विकल्प जार फ़ाइल से अपमानजनक फ़ाइल (फ़ाइलें) को हटाने के लिए होगा:

#!/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

स्कैनिंग कोड से पहले जोड़ने के लिए 'shopt -s globstar' मत भूलना पद के शीर्ष पर। –