【问题标题】:Spring Boot IllegalStateException ArchiveDescriptor reused; can URLs be processed multiple times?Spring Boot IllegalStateException ArchiveDescriptor 重用;可以多次处理 URL 吗?
【发布时间】:2014-10-24 08:49:52
【问题描述】:

我正在使用休眠模式运行 Spring Boot 应用程序,但是遇到了一些问题。

注意:如果我直接从 Eclipse 中运行应用程序,一切正常。 但是,如果我使用 spring-boot 插件将其打包为 jar 并运行该 Jar,我将收到以下错误

使用休眠核心版本:4.3.6

java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:601)
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:53)
        at java.lang.Thread.run(Thread.java:722)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'fakeEntityManagerFactory' defined in class path resource [com/my/package/fake/lib/fakeContext.x
ml]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: ArchiveDescriptor reused; can URLs be processed multiple times?
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1554)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
        at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:975)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:752)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:109)
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:691)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:320)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:952)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:941)
        at com.my.package.fake.app.boot.FakeAppBooter.main(FakeAppBooter.java:16)
        ... 6 more
Caused by: java.lang.IllegalStateException: ArchiveDescriptor reused; can URLs be processed multiple times?
        at org.hibernate.jpa.boot.scan.spi.AbstractScannerImpl.validateReuse(AbstractScannerImpl.java:223)
        at org.hibernate.jpa.boot.scan.spi.AbstractScannerImpl.buildArchiveDescriptor(AbstractScannerImpl.java:102)
        at org.hibernate.jpa.boot.scan.spi.AbstractScannerImpl.scan(AbstractScannerImpl.java:63)
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.scan(EntityManagerFactoryBuilderImpl.java:723)
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:219)
        at org.hibernate.jpa.boot.spi.Bootstrap.getEntityManagerFactoryBuilder(Bootstrap.java:51)
        at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilder(HibernatePersistenceProvider.java:182)
        at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilder(HibernatePersistenceProvider.java:177)
        at org.hibernate.jpa.HibernatePersistenceProvider.createContainerEntityManagerFactory(HibernatePersistenceProvider.java:152)
        at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:336)
        at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:318)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1613)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1550)
        ... 21 more

使用 hibernate-core 版本:4.2.15

java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:601)
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:53)
        at java.lang.Thread.run(Thread.java:722)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'fakeEntityManagerFactory' defined in class path resource [com/my/package/fake/lib/fakeContext.x
ml]: Invocation of init method failed; nested exception is java.lang.RuntimeException: error trying to scan <jar-file>: file:/C:/dev/trees/ix-platform/FakesSpringBoot/providers/providers/fake/app/targ
et/__fake.jar
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1554)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
        at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:975)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:752)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:109)
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:691)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:320)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:952)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:941)
        at com.my.package.fake.app.boot.FakeAppBooter.main(FakeAppBooter.java:16)
        ... 6 more
Caused by: java.lang.RuntimeException: error trying to scan <jar-file>: file:/C:/dev/trees/ix-platform/FakesSpringBoot/providers/providers/fake/app/target/__fake.jar
        at org.hibernate.ejb.Ejb3Configuration.scanForClasses(Ejb3Configuration.java:864)
        at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:600)
        at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:75)
        at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:336)
        at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:318)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1613)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1550)
        ... 21 more
Caused by: org.hibernate.AssertionFailure: Cannot read files twice on NativeScanner
        at org.hibernate.ejb.packaging.NativeScanner.getFilesInJar(NativeScanner.java:168)
        at org.hibernate.ejb.Ejb3Configuration.addScannedEntries(Ejb3Configuration.java:506)
        at org.hibernate.ejb.Ejb3Configuration.scanForClasses(Ejb3Configuration.java:861)
        ... 27 more

给出问题的 bean 是这样的:

<bean id="fakeEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" 
    depends-on="fakeJpaProperties,fakeDataSource">
    <property name="persistenceUnitName" value="fake" />
    <property name="persistenceUnitManager">
        <bean class="com.my.package.lib.persistence.MergingUnitManager">
            <property name="persistenceXmlLocations">
                <list>
                    <value>classpath*:META-INF/fake/persistence.xml</value>
                </list>
            </property>
        </bean>
    </property>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="generateDdl" value="false" />
        </bean>
    </property>
</bean>

被加载两次的 jar 显然是我正在运行的主 jar。

关于这个问题可能来自哪里的任何想法?

补充说明:

正在加载的persistence.xml的唯一内容是:&lt;persistence-unit name="fake" /&gt;

【问题讨论】:

  • 问题可能是由您的 com.my.package.lib.persistence.MergingUnitManager 合并持久性上下文的方式引起的。我有同样的问题,找到了你的问题。也许如果您发布 MergingUnitManager 的来源,人们可以更好地帮助您(和我)。

标签: java eclipse spring hibernate spring-boot


【解决方案1】:

在为 Spring 3.2 和多个持久性上下文实现 MergingPersistenceUnitManager 技巧 as described here 时,我注意到 Spring 无法处理 persistenceUnitRootURL 最终出现在 jarFile 中的事实。

ArrayList<URL> combinedNewURLs = new ArrayList<>();
combinedNewURLs.addAll(newPU.getJarFileUrls());
combinedNewURLs.add(newPU.getPersistenceUnitRootUrl());
if (!combinedNewURLs.contains(oldPU.getPersistenceUnitRootUrl())){
    // Root url of existing persistenceunit not known in the 
    // new one, add it as jar url.
    newPU.addJarFileUrl(oldPU.getPersistenceUnitRootUrl());
}

这解决了“ArchiveDescriptor used”问题。不知道会不会引起其他问题。

【讨论】:

  • 不幸的是,此应用程序的代码早已不复存在,但是这看起来有些熟悉,因此我将其标记为答案。但是,我不能保证它会起作用。
  • @mangusbrother 你不应该在没有测试的情况下标记答案。您最终会让后续访问者认为答案是正确的。
  • 如果有人能证明它不正确,请做我的客人,但是我不再拥有原始问题的内容,并且重新创建它需要太多时间,而这确实看起来很熟悉
猜你喜欢
  • 1970-01-01
  • 2018-04-04
  • 1970-01-01
  • 2017-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-13
  • 2016-11-25
相关资源
最近更新 更多