ArchiveException:无法构建ClassFile

时间:2018-01-19 23:49:13

标签: java hibernate jboss

我遇到了在JBOSS 10.1.2上部署EAR的问题

我得到了一个愚蠢的例外:

Caused by: org.hibernate.boot.archive.spi.ArchiveException: Could not build ClassFile
    at org.hibernate.boot.archive.scan.spi.ClassFileArchiveEntryHandler.toClassFile(ClassFileArchiveEntryHandler.java:64)
    at org.hibernate.boot.archive.scan.spi.ClassFileArchiveEntryHandler.handleEntry(ClassFileArchiveEntryHandler.java:47)
    at org.jboss.as.jpa.hibernate5.VirtualFileSystemArchiveDescriptor.processVirtualFile(VirtualFileSystemArchiveDescriptor.java:94)
    at org.jboss.as.jpa.hibernate5.VirtualFileSystemArchiveDescriptor.processVirtualFile(VirtualFileSystemArchiveDescriptor.java:69)
    at org.jboss.as.jpa.hibernate5.VirtualFileSystemArchiveDescriptor.processVirtualFile(VirtualFileSystemArchiveDescriptor.java:69)
    at org.jboss.as.jpa.hibernate5.VirtualFileSystemArchiveDescriptor.visitArchive(VirtualFileSystemArchiveDescriptor.java:49)
    at org.hibernate.boot.archive.scan.spi.AbstractScannerImpl.scan(AbstractScannerImpl.java:47)
    at org.hibernate.boot.model.process.internal.ScanningCoordinator.coordinateScan(ScanningCoordinator.java:75)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.prepare(MetadataBuildingProcess.java:98)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:199)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:149)
    at org.hibernate.jpa.boot.spi.Bootstrap.getEntityManagerFactoryBuilder(Bootstrap.java:28)
    at org.hibernate.jpa.boot.spi.Bootstrap.getEntityManagerFactoryBuilder(Bootstrap.java:40)
    at org.jboss.as.jpa.hibernate5.TwoPhaseBootstrapImpl.<init>(TwoPhaseBootstrapImpl.java:39)
    at org.jboss.as.jpa.hibernate5.HibernatePersistenceProviderAdaptor.getBootstrap(HibernatePersistenceProviderAdaptor.java:159)
    at org.jboss.as.jpa.service.PhaseOnePersistenceUnitServiceImpl.createContainerEntityManagerFactoryBuilder(PhaseOnePersistenceUnitServiceImpl.java:242)
    at org.jboss.as.jpa.service.PhaseOnePersistenceUnitServiceImpl.access$800(PhaseOnePersistenceUnitServiceImpl.java:59)
    at org.jboss.as.jpa.service.PhaseOnePersistenceUnitServiceImpl$1$1.run(PhaseOnePersistenceUnitServiceImpl.java:117)
    ... 7 more

我在网上看了一下,发现这个例外的原因是 javassist版本不同。

this post on stackoverflow中的答案没有用,因为我既不使用Spring,也不使用Weblogic,也不使用Thymyleaf。

有两个库使用javassist: Hibernate org.reflections 。使用Maven依赖树我可以找到以下内容:

org.reflections

[INFO] |  +- org.reflections:reflections:jar:0.9.11:compile
[INFO] |  |  +- (com.google.guava:guava:jar:20.0:compile - omitted for conflict with 21.0)
[INFO] |  |  \- (org.javassist:javassist:jar:3.21.0-GA:compile - omitted for conflict with 3.20.0-GA)

Hibernate

[INFO] |  |  +- org.hibernate:hibernate-core:jar:5.2.8.Final:provided
[INFO] |  |  |  +- (org.jboss.logging:jboss-logging:jar:3.3.0.Final:provided - omitted for conflict with 3.1.4.GA)
[INFO] |  |  |  +- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:jar:1.0.0.Final:provided
[INFO] |  |  |  +- org.javassist:javassist:jar:3.20.0-GA:provided

我的lib EAR文件夹包含

hibernate-core-5.2.8.Final.jar
javassist-3.20.0-GA.jar

JBOSS还有一个带

的javassists模块
javassist-3.18.1.GA-redhat-2.jar

现在我对整个问题有点困惑。我尝试删除 org.reflections 的引用,但部署仍然失败。

有人有想法吗?

修改

好的,我发现哪个库导致异常:

<dependency>
   <groupId>com.google.template</groupId>
   <artifactId>soy</artifactId>
   <version>2018-01-03</version>
</dependency>

但我不知道如何解决这个问题。

修改

好的,我尝试使用以前的maven版本的图书馆(2017-08-08),它的确有效。不知道问题是什么。应该可以在Github上向图书馆老板报告。如果有人有想法,欢迎你。

2 个答案:

答案 0 :(得分:1)

@@ GlenPeterson在评论中提到:

  

我遇到了这个问题,并将maven-shade-plugin从2.4.3升级到3.1.1修复了它。

将maven-shade-plugin从2.4.3升级到3.2.1(现在是最新版本)是可行的。我看到阴影插件创建了一个稍小的uber jar。

答案 1 :(得分:0)

问题是由javassist冲突引起的

  1. 您可以使用:mvn dependency:tree,找到包含Javassist的jar
  2. 您可以排除它:
<dependency>
    <groupId>xxx</groupId>
    <artifactId>xxx</artifactId>
    <version>xxxx</version>
    <exclusions>
        <!-- 排除javassist-->
        <exclusion>
            <groupId>javassist</groupId>
            <artifactId>javassist</artifactId>
        </exclusion>
    </exclusions>
</dependency>