【问题标题】:Could not build ClassFile - ArchiveException无法构建 ClassFile - ArchiveException
【发布时间】:2014-11-29 13:41:08
【问题描述】:

我们用spring、jpa、tomcat、maven等开发应用。

在我的开发人员机器上本地一切正常,但是当我们在 linux 服务器上部署应用程序时,出现以下异常:

org.hibernate.jpa.boot.archive.spi.ArchiveException: Could not build ClassFile
    org.hibernate.jpa.boot.scan.spi.ClassFileArchiveEntryHandler.toClassFile(ClassFileArchiveEntryHandler.java:88)
    org.hibernate.jpa.boot.scan.spi.ClassFileArchiveEntryHandler.handleEntry(ClassFileArchiveEntryHandler.java:65)
    org.hibernate.jpa.boot.archive.internal.JarFileBasedArchiveDescriptor.visitArchive(JarFileBasedArchiveDescriptor.java:176)
    org.hibernate.jpa.boot.scan.spi.AbstractScannerImpl.scan(AbstractScannerImpl.java:72)
    org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.scan(EntityManagerFactoryBuilderImpl.java:723)
    org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:219)
    org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:186)
    org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider$1.<init>(SpringHibernateJpaPersistenceProvider.java:49)
    org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:49)
    org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:341)
    org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:318)
    org.domain.application.persistence.repository.DataSourceConfiguration.entityManagerFactory(DataSourceConfiguration.java:78)
    org.domain.application.persistence.repository.DataSourceConfiguration$$EnhancerBySpringCGLIB$$52a56856.CGLIB$entityManagerFactory$0(<generated>)
    org.domain.application.persistence.repository.DataSourceConfiguration$$EnhancerBySpringCGLIB$$52a56856$$FastClassBySpringCGLIB$$44eff5a3.invoke(<generated>)
    org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)
    org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:312)
    org.domain.application.persistence.repository.DataSourceConfiguration$$EnhancerBySpringCGLIB$$52a56856.entityManagerFactory(<generated>)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:483)
    org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:166)
    org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:590)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1113)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1008)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:505)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
    org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
    org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:229)
    org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328)
    org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108)
    org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:636)
    org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:446)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1113)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1008)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:505)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
    org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:276)
    org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:129)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1471)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1216)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:538)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
    org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
    org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:229)
    org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1081)
    org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1006)
    org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:904)
    org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:815)
    org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:743)
    org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:185)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1133)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1036)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:505)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
    org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
    org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:229)
    org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1081)
    org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1006)
    org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:904)
    org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:514)
    org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
    org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:323)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1204)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:538)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
    org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
    org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:229)
    org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:725)
    org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
    org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
    org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:658)
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:624)
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:672)
    org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:543)
    org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:484)
    org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
    javax.servlet.GenericServlet.init(GenericServlet.java:158)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:537)
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1085)
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658)
    org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1556)
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1513)
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    java.lang.Thread.run(Thread.java:745)

我调用这个方法初始化数据库后代码中出现异常:

org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet()

找不到问题。帮助表示赞赏!谢谢

【问题讨论】:

  • 我有同样的症状,在我的例子中,与 icu4j 传递性包含并重新打包到同一个 jar 中有关,这使得 javaassist 也扫描 icu4j 类,因此恰好遇到一个类(com/ javassist 无法解析的 ibm/icu/impl/data/LocaleElements_zh__PINYIN.class)

标签: spring hibernate jpa orm entity


【解决方案1】:

问题可能是 java 版本和 javaassist 版本之间的冲突。如果您在服务器上使用 java 8,则应确保也使用最新的 javassist 版本。这个blog 显示冲突的起源在 thymeleaf 内部,它引入了一个较旧的 javassist,解决方案是将其从依赖项中排除

<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf</artifactId>
    <version>${thymeleaf.version}</version>
    <exclusions>
        <exclusion>
            <artifactId>javassist</artifactId>
            <groupId>org.javassist</groupId>
        </exclusion>
    </exclusions>
</dependency>

您的情况可能不同,因此您应该检查依赖关系树以找到合适的解决方案

【讨论】:

  • 问题是 javassist 库的旧版本。但我不明白这在我的本地机器上不是问题。感谢您的帮助!
  • 百里香也是我的情况
【解决方案2】:

我遇到了完全相同的问题,它在开发机器上运行良好,然后在生产中失败了。

如果你在本地构建war文件然后解压缩它可以看出原因。你会看到你最终得到了两个 javassist jar:

javassist-3.11.0.GA.jar
javassist-3.18.1-GA.jar

它们将一起部署在同一个 lib 文件夹中。因此,当您的 java 应用程序加载并需要 javassist 库中的一个类时,它将搜索类路径并且 可能 遇到第一个(并且不正确的)jar 并加载它。 p>

可能不会在本地发生,因为您的 buld 工具(maven,或者在我的情况下是 gradle)构造了一个长而复杂的特定资源类路径,它可能首先指定兼容版本,这使得类路径搜索更有可能找到它。

(我一直说可能,因为这将取决于类路径搜索的实现方式,我认为这可能取决于 JVM 和其他东西,但我没有动力去立即查找,但会将其添加到我的 TODO 列表并回复您……或者如果其他人知道答案,请编辑此帖子!)

Anway,对于任何gradle 用户,我使用以下 sn-p 解决了问题:

configurations {
    all*.exclude group: 'javassist', module: 'javassist' // get rid of hibernate-incompatible javassist
}

我不得不使用全局排除,因为 javassist-3.11 库(组:'javassist')作为依赖项的依赖项的依赖项被拉入,而 hibernate 想要 javassist-3.18 库(组:'org. javassist') 代替。

感谢所有参与,特别是master-slave

【讨论】:

  • 遇到javassist-3.12.x.GA.jar也是一样。
【解决方案3】:

我在尝试将 Java 8 应用程序部署到 Weblogic 12.1.3c 时遇到了同样的问题。 我所做的是将其添加到 weblogic.xml

    <wls:prefer-application-packages>
        <wls:package-name>javassist</wls:package-name>
    </wls:prefer-application-packages>

【讨论】:

    【解决方案4】:

    感谢master-slave,我发现了问题,因为他描述了与不兼容的 javassist 的 java 8 库存在冲突。

    在我的例子中,它是瓦片的依赖:

    <dependency>
        <groupId>org.apache.tiles</groupId>
        <artifactId>tiles-extras</artifactId>
        <version>3.0.5</version>
        <exclusions>
            <exclusion>
                <artifactId>javassist</artifactId>
                <groupId>jboss</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    

    【讨论】:

    • 正确!!!我使用了你的建议,我的异常解决了。谢谢。顺便说一句,我也从我的 org.apache.struts 中排除了 java 辅助。 org.apache.strutsstruts2-tiles3-plugin
    • 我在使用 LightAdmin 时遇到了这个问题。原来它引用了瓷砖和 javassist,所以你需要从 jboss 和 org.javassist groupIds 中排除 javassist。感谢@master-slave 和 myborobudur 拯救了我的一天!
    • 将依赖项添加到 concordion:2.0.2 时遇到了同样的问题。解决方法是一样的:org.concordionconcordion2.0.2testjavassistjavassist
    【解决方案5】:

    添加以下依赖可能会解决问题。

    <dependency>
    <groupId>org.javassist</groupId>
    <artifactId>javassist</artifactId>
    <version>3.22.0-GA</version>
    </dependency>
    

    【讨论】:

    • 为我工作。有人知道这个库是什么以及它是如何工作的吗?
    【解决方案6】:

    将插件依赖项从 2.1 升级到 3.2.1 为我解决了这个问题 <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.1</version>

    【讨论】:

    • 这对我也有用!无论如何,为什么会发生这种情况有什么具体原因吗?
    【解决方案7】:

    我遇到了同样的异常。我使用 java 8、休眠、jpa、码头。

    我通过将这些更新到最新的可用版本来解决它:

    compile group: 'org.hibernate', name: 'hibernate-core', version: '5.3.3.Final'
    compile group: 'org.hibernate', name: 'hibernate-entitymanager', version: '5.3.3.Final'
    compile group: 'org.hibernate', name: 'hibernate-validator', version: '6.0.11.Final'
    

    【讨论】:

      【解决方案8】:

      这个异常是由于javassist的错误/冲突版本,使用这个命令找出来-->

          mvn dependency:tree | grep javassist
      

      然后通过像这样排除该版本的 javassist 来解决它 -->

          <dependency>
              <groupId>com.wordnik</groupId>
              <artifactId>swagger-jaxrs_2.10</artifactId>
              <version>1.3.11</version>
              <exclusions>        
                  <exclusion>
                      <artifactId>javassist</artifactId>
                      <groupId>org.javassist</groupId>
                  </exclusion>
              </exclusions>
          </dependency>
      

      【讨论】:

        【解决方案9】:

        我遇到了同样的问题。在我的情况下,解决方案是通过这种方式升级这些休眠依赖项(有问题的版本是 5.2.1.Final):

                <dependency>
                    <groupId>org.hibernate</groupId>
                    <artifactId>hibernate-core</artifactId>
                    <version>5.3.3.Final</version>
                </dependency>
                <dependency>
                    <groupId>org.hibernate</groupId>
                    <artifactId>hibernate-entitymanager</artifactId>
                    <version>5.3.3.Final</version>
                </dependency>
        

        【讨论】:

          【解决方案10】:

          我对 thymleaf 3.0.0.BETA01 和两个不同的 javaassist 版本有同样的问题。 Thymeleaf 拉取 javaassist 3.11(导致错误)。

          这里是固定的 pom-entry:

              <dependency>
                  <groupId>org.thymeleaf</groupId>
                  <artifactId>thymeleaf</artifactId>
                  <version>3.0.0.BETA01</version>
                  <exclusions>
                      <exclusion>
                          <groupId>javassist</groupId>
                          <artifactId>javassist</artifactId>
                      </exclusion>
                  </exclusions>
              </dependency>
          

          【讨论】:

            【解决方案11】:

            自己分析

            如果javassist 不是您的依赖问题,则您必须进行自己的依赖分析。这就是我所做的。

            1. 通过提取依赖项并查看同一库的不同版本来定位冲突。我执行mvn dependency:list | sort --unique &gt; dependencies_list.txt 来生成一个依赖项排序文件,每个库版本只有一行。这种方式更容易找到同一库的重复条目。

            2. 找到每个依赖项的导入位置。使用已经建议的mvn dependency:tree &gt; dependency_tree.txt,您可以获得依赖关系树,您可以在其中搜索导致每个版本冲突的依赖层次结构。

            3. 一旦找到导致不同版本冲突的库,请尝试更新它们的版本或从其中一个中排除引起冲突的元素。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-04-11
              • 1970-01-01
              • 2018-03-23
              • 2019-08-03
              • 2012-04-30
              • 2018-06-19
              相关资源
              最近更新 更多