既存のアプリケーションを管理するための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
hibernate 3.4と3.5の両方で試しましたが、まったく同じエラーが発生します。これはjavassistの問題ですか?
更新:Eclipse内でアプリケーションを正常に実行できますが(右クリック->実行-> Javaアプリケーション)、mavenで生成されたjar-with-dependenciesの使用は失敗します。違いは、Eclipseではjavassistが含まれているjarを検査するのではなく、すべてのクラスファイル(およびおそらくいくつかの依存するサードパーティのjar)を検査することだと思います。