2010-06-12 6 views
6

Tôi đang tạo công cụ cli để quản lý ứng dụng hiện có. Cả hai ứng dụng và các bài kiểm tra xây dựng tốt và chạy tốt nhưng mặc dù trước đó tôi nhận được một thất bại Javassist khi chạy công cụ cli của tôi hiện có trong jar:Lỗi Javassist trong chế độ ngủ đông: loại hằng số không hợp lệ: 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 

Kể từ khi tôi biết jar là tốt như các đơn vị và kiểm tra tích hợp chạy chống lại nó, tôi nghĩ rằng nó có thể là một vấn đề với javassist, vì vậy tôi đã cố gắng cglib. Các nhà cung cấp bytecode sau đó cho thấy như cglib nhưng tôi vẫn nhận được cùng một dấu vết stack với javassist hiện diện trong đó.

cglib chắc chắn là trong classpath:

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

Tôi đã thử với cả hai ngủ đông 3.4 và 3.5 và nhận được lỗi chính xác tương tự. Đây có phải là vấn đề với javassist không?

CẬP NHẬT: Tôi có thể chạy các ứng dụng thành công trong Eclipse (phải cấp nhấp chuột> Run như-> Java Application), nhưng sử dụng maven tạo jar-với-phụ thuộc bị lỗi. Tôi cho rằng sự khác biệt là với javassist Eclipse không kiểm tra jar chứa, thay vào đó, nó kiểm tra tất cả các tệp lớp (và có lẽ một vài lọ bên thứ ba phụ thuộc).

Trả lời

19

Vấn đề cuối cùng gây ra bởi một lớp không hợp lệ trong icu4j-2.6.1 như có thể thấy trong this post. Cụ thể, tập tin này là không hợp lệ:

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

Đây là một cách đơn giản để xác định một tập tin bị hỏng:

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 

tập tin này đã được bao gồm theo gián tiếp bởi maven qua phụ thuộc bắc cầu của nó đó là lý do tôi đã không' t nhận ra trang đó là tham chiếu đến lỗi và một tệp chứa trong bình làm nguyên nhân và nguyên nhân gây ra sự cố. Đây là cách nó đã kết thúc trong tôi bó jar-với-phụ thuộc:

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

Sau khi thêm loại trừ sau vào jaxen phụ thuộc, tất cả mọi thứ đã làm việc một cách chính xác đối với tôi (nhưng phải cẩn thận nếu bạn cần mẩu nội địa hóa của nó):

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

Một lựa chọn khác sẽ là để loại bỏ các tập tin vi phạm (s) từ file jar:

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

Đừng quên để thêm 'shopt -s globstar' trước khi mã quét ở đầu bài đăng. –