Tomcat 6 и 7: WebappClassLoader: попытка дублирования определения класса для имени: org/apache/openjpa/persistence/osgi/BundleUtils

Я пытаюсь запустить tomcat с openjpa 2.3.0 и spring 3.1.4.

У меня может быть основная проблема с загрузкой классов, но это довольно сложно понять, и я застрял на 2 дня.

<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>
<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="MyPersistence"/>
    <property name="persistenceXmlLocation" value="classpath:/META-INF/persistence.xml"/>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter"/>
    </property>
</bean>

И вот трассировка стека:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [spring/components/spring-appserver-beans.xml]: Invocation of init method failed; nested exception is java.lang.LinkageError: loader (instance of  org/apache/catalina/loader/WebappClassLoader): attempted  duplicate class definition for name: "org/apache/openjpa/persistence/osgi/BundleUtils"
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1455) ~[spring-beans-3.1.4.RELEASE.jar:3.1.4.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) ~[spring-beans-3.1.4.RELEASE.jar:3.1.4.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) ~[spring-beans-3.1.4.RELEASE.jar:3.1.4.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294) ~[spring-beans-3.1.4.RELEASE.jar:3.1.4.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225) ~[spring-beans-3.1.4.RELEASE.jar:3.1.4.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291) ~[spring-beans-3.1.4.RELEASE.jar:3.1.4.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) ~[spring-beans-3.1.4.RELEASE.jar:3.1.4.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1105) ~[spring-context-3.1.4.RELEASE.jar:3.1.4.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:915) ~[spring-context-3.1.4.RELEASE.jar:3.1.4.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:472) ~[spring-context-3.1.4.RELEASE.jar:3.1.4.RELEASE]
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:388) ~[spring-web-3.1.4.RELEASE.jar:3.1.4.RELEASE]
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:293) ~[spring-web-3.1.4.RELEASE.jar:3.1.4.RELEASE]
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111) [spring-web-3.1.4.RELEASE.jar:3.1.4.RELEASE]
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4206) [catalina.jar:6.0.37]
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4705) [catalina.jar:6.0.37]
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:799) [catalina.jar:6.0.37]
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:779) [catalina.jar:6.0.37]
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:601) [catalina.jar:6.0.37]
    at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1429) [catalina.jar:6.0.37]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.6.0_35]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) ~[na:1.6.0_35]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ~[na:1.6.0_35]
    at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_35]
    at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:297) [tomcat-coyote.jar:6.0.37]
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:836) [na:1.6.0_35]
    at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:761) [na:1.6.0_35]
    at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:631) [catalina.jar:6.0.37]
    at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:568) [catalina.jar:6.0.37]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.6.0_35]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) ~[na:1.6.0_35]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ~[na:1.6.0_35]
    at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_35]
    at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:295) [tomcat-coyote.jar:6.0.37]
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:836) [na:1.6.0_35]
    at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:761) [na:1.6.0_35]
    at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1427) [na:1.6.0_35]
    at javax.management.remote.rmi.RMIConnectionImpl.access$200(RMIConnectionImpl.java:72) [na:1.6.0_35]
    at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1265) [na:1.6.0_35]
    at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1360) [na:1.6.0_35]
    at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:788) [na:1.6.0_35]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.6.0_35]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) ~[na:1.6.0_35]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ~[na:1.6.0_35]
    at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_35]
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:303) [na:1.6.0_35]
    at sun.rmi.transport.Transport$1.run(Transport.java:159) [na:1.6.0_35]
    at java.security.AccessController.doPrivileged(Native Method) [na:1.6.0_35]
    at sun.rmi.transport.Transport.serviceCall(Transport.java:155) [na:1.6.0_35]
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535) [na:1.6.0_35]
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790) [na:1.6.0_35]
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649) [na:1.6.0_35]
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) [na:1.6.0_35]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) [na:1.6.0_35]
    at java.lang.Thread.run(Thread.java:662) [na:1.6.0_35]
Caused by: java.lang.LinkageError: loader (instance of  org/apache/catalina/loader/WebappClassLoader): attempted  duplicate class definition for name: "org/apache/openjpa/persistence/osgi/BundleUtils"
    at java.lang.ClassLoader.defineClass1(Native Method) ~[na:1.6.0_35]
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631) ~[na:1.6.0_35]
    at java.lang.ClassLoader.defineClass(ClassLoader.java:615) ~[na:1.6.0_35]
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) ~[na:1.6.0_35]
    at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2854) ~[catalina.jar:6.0.37]
    at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1159) ~[catalina.jar:6.0.37]
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1647) ~[catalina.jar:6.0.37]
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526) ~[catalina.jar:6.0.37]
    at org.apache.openjpa.persistence.PersistenceProviderImpl.createContainerEntityManagerFactory(PersistenceProviderImpl.java:185) ~[openjpa-2.3.0.jar:2.3.0]
    at org.apache.openjpa.persistence.PersistenceProviderImpl.createContainerEntityManagerFactory(PersistenceProviderImpl.java:62) ~[openjpa-2.3.0.jar:2.3.0]
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:287) ~[spring-orm-3.1.4.RELEASE.jar:3.1.4.RELEASE]
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:310) ~[spring-orm-3.1.4.RELEASE.jar:3.1.4.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514) ~[spring-beans-3.1.4.RELEASE.jar:3.1.4.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452) ~[spring-beans-3.1.4.RELEASE.jar:3.1.4.RELEASE]
    ... 53 common frames omitted

Я совершенно уверен, что совершаю распространенную ошибку, которая стоит мне много времени, поэтому любая помощь будет приветствоваться.

Большое спасибо.


person Cousnouf    schedule 03.10.2014    source источник
comment
Как вы создаете свое веб-приложение, используя Maven? Поскольку spring-orm-3.1.4 содержит зависимость от org.apache.openjpa-openjpa-1.1.0, она может конфликтовать с объявленной вами зависимостью от той же библиотеки более поздней версии.   -  person Yuriy Nakonechnyy    schedule 03.10.2014
comment
Здравствуйте, да, я использую Maven. Затем я проверю пружинную форму, чтобы удалить повторяющийся класс. Спасибо, буду держать вас на связи.   -  person Cousnouf    schedule 07.10.2014
comment
Привет, к сожалению, это ничего не меняет. И даже когда я просматриваю все классы, видимые в моем пути к классам, я нахожу только один BundleUtils. Это действительно странно.   -  person Cousnouf    schedule 13.10.2014
comment
Хм, тогда не имею ни малейшего представления... Что такое содержимое папки <tomcat>/webapps/<your-webapp>/WEB-INF/lib? Сколько у него openjpa библиотек? Также проверьте папку <tomcat>/lib/ — есть ли в ней openjpa JAR-файлов?   -  person Yuriy Nakonechnyy    schedule 13.10.2014
comment
На самом деле это совсем не так. Файлы: annotations-api.jar, catalina.jar, catalina-ant.jar, catalina-ha.jar, catalina-tribes.jar, ecj-P20140317-1600.jar, el-api.jar, jasper.jar, jasper. -el.jar, jsp-api.jar, ojdbc6.jar, org.springframework.instrument-3.1.4.RELEASE.jar, servlet-api.jar, tomcat7-websocket.jar, tomcat-api.jar, tomcat-coyote .jar, tomcat-dbcp.jar, tomcat-i18n-es.jar, tomcat-i18n-fr.jar, tomcat-i18n-ja.jar, tomcat-jdbc.jar, tomcat-util.jar, websocket-api.jar Большинство из них кажется безвредным для этой проблемы. Я проведу расследование сегодня с коллегой, который может оказать неоценимую помощь.   -  person Cousnouf    schedule 16.10.2014
comment
да, вы правы - эти баночки не имеют отношения к вашей проблеме. Возможно, также попробуйте это: stackoverflow.com/questions/7176829/   -  person Yuriy Nakonechnyy    schedule 16.10.2014
comment
Я столкнулся с той же проблемой, только немного другой. Я использую Javassist для изменения классов с помощью байт-кода при запуске. Tomcat 6 - работает абсолютно нормально. Tomcat 7 - javassist.CannotCompileException: от java.lang.LinkageError: загрузчик (экземпляр org/apache/catalina/loader/WebappClassLoader): попытка дублирования определения класса для имени: com/xxx/dao/entities/User Попытка изменить способ загрузчиков классов запускаются с использованием ‹Loader delegate=true/› - не повезло. - из tomcat.apache.org/tomcat-7.0-doc/ class-loader-howto.html   -  person David Fischer    schedule 07.04.2016