Kal*_*son 6 java hibernate cglib javassist
我正在创建一个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
Run Code Online (Sandbox Code Playgroud)
因为我知道jar是好的,因为单元和集成测试对它运行,我认为它可能是javassist的问题,所以我尝试了cglib.然后字节码提供程序显示为cglib,但我仍然得到完全相同的堆栈跟踪,其中包含javassist.
cglib肯定在类路径中:
$ unzip -l flexipol-jar-with-dependencies.jar | grep cglib | wc -l
383
Run Code Online (Sandbox Code Playgroud)
我已尝试使用hibernate 3.4和3.5并获得完全相同的错误.这是javassist的问题吗?
更新:我可以在Eclipse中成功运行应用程序(右键单击 - >运行As-> Java应用程序),但使用maven生成的jar-with-dependencies失败.我认为不同之处在于Eclipse javassist不检查包含jar,而是检查所有类文件(可能还有一些依赖的第三方jar).
Kal*_*son 19
这个问题最终是由一个无效的类引起的,icu4j-2.6.1如本文所示.具体来说,此文件无效:
com/ibm/icu/impl/data/LocaleElements_zh__PINYIN.class
Run Code Online (Sandbox Code Playgroud)
这是识别损坏文件的简单方法:
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
Run Code Online (Sandbox Code Playgroud)
该文件由maven通过其传递依赖性间接包含,这就是为什么我不认识该页面引用错误和jar中包含的文件是问题的罪魁祸首和原因.以下是它最终包含在我的jar-with-dependencies包中的方法:
jaxen-1.1.1 -> xom-1.0 -> icu4j-2.6.1
Run Code Online (Sandbox Code Playgroud)
将以下排除项添加到jaxen依赖项后,一切都正常对我(但如果您需要其本地化部分,请小心):
<exclusions>
<exclusion>
<groupId>com.ibm.icu</groupId>
<artifactId>icu4j</artifactId>
</exclusion>
</exclusions>
Run Code Online (Sandbox Code Playgroud)
另一个选择是从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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8690 次 |
| 最近记录: |