hibernate中的Javassist失败:无效的常量类型:60

我正在创建一个cli工具来管理现有的应用程序。 应用程序和测试都构建良好并运行良好,但尽管我在运行jar中存在的cli工具时收到javassist失败:

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.(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.(ConstPool.java:127) at javassist.bytecode.ClassFile.read(ClassFile.java:693) at javassist.bytecode.ClassFile.(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 

因为我知道jar是好的,因为单元和集成测试对它运行,我认为它可能是javassist的问题,所以我尝试了cglib。 然后字节码提供程序显示为cglib,但我仍然得到完全相同的堆栈跟踪,其中包含javassist。

cglib肯定在类路径中:

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

我已尝试使用hibernate 3.4和3.5并获得完全相同的错误。 这是javassist的问题吗?

更新 :我可以在Eclipse中成功运行应用程序(右键单击 – >运行As-> Java应用程序),但使用maven生成的jar-with-dependencies失败。 我认为不同之处在于,Eclipse javassist并没有检查包含jar,而是检查所有类文件(可能还有一些依赖的第三方jar)。

问题最终是由icu4j-2.6.1的无效类引起的,如本文所示 。 具体来说,此文件无效:

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

这是识别损坏文件的简单方法:

 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 

该文件由maven通过其传递依赖性间接包含,这就是为什么我没有将该页面视为引用错误和jar中包含的文件作为问题的罪魁祸首和原因。 这是它最终包含在我的jar-with-dependencies包中的方式:

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

jaxen依赖项中添加以下排除后,一切正常对我来说(但是如果你需要它的本地化部分,要小心):

   com.ibm.icu icu4j   

另一个选择是从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