休眠中的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.<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

由于我知道jar可以很好地进行单元测试和集成测试,因此我认为javassist可能存在问题,因此我尝试了cglib。然后,字节码提供程序显示为cglib,但是我仍然得到与其中存在javassist完全相同的堆栈跟踪。

cglib肯定在类路径中:

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

383

我已经尝试过hibernate3.4和3.5并得到完全相同的错误。这是javassist的问题吗?

:我可以在Eclipse中成功运行该应用程序(右键单击->运行方式-> 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依赖项之后,一切对我来说都正常工作(但是,如果需要其本地化部分,请小心):

<exclusions>

<exclusion>

<groupId>com.ibm.icu</groupId>

<artifactId>icu4j</artifactId>

</exclusion>

</exclusions>

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

以上是 休眠中的Javassist失败:无效的常量类型:60 的全部内容, 来源链接: utcz.com/qa/412190.html

回到顶部