WebSphere 上 Spring-Eclipselink 应用程序中动态编织时的 Stackoverflow 异常



我正在做一个项目,该项目将Spring 4.0,Eclipselink 2.6.3作为JPA与WebSphere 8.5应用程序服务器。我没有使用Maven。

我给了-javaagent:eclipselink-2.6.3.jar(绝对路径)。

每当我重新启动服务器时,我都会收到以下异常:

Caused by: java.lang.StackOverflowError: operating system stack overflow
at org.eclipse.persistence.internal.jpa.weaving.PersistenceWeaver.transform(PersistenceWeaver.java:98)
at com.ibm.ws.jpa.management.JPAPUnitInfo.transformClass(JPAPUnitInfo.java:1987)
at com.ibm.ws.classloader.CompoundClassLoader._defineClass(CompoundClassLoader.java:851)
at com.ibm.ws.classloader.CompoundClassLoader.localFindClass(CompoundClassLoader.java:764)
at com.ibm.ws.classloader.CompoundClassLoader.loadClass(CompoundClassLoader.java:587)
at java.lang.ClassLoader.loadClass(ClassLoader.java:827)
at org.eclipse.persistence.internal.jpa.weaving.PersistenceWeaver.transform(PersistenceWeaver.java:98)
at com.ibm.ws.jpa.management.JPAPUnitInfo.transformClass(JPAPUnitInfo.java:1987)
at com.ibm.ws.classloader.CompoundClassLoader._defineClass(CompoundClassLoader.java:851)
at com.ibm.ws.classloader.CompoundClassLoader.localFindClass(CompoundClassLoader.java:764)
at com.ibm.ws.classloader.CompoundClassLoader.loadClass(CompoundClassLoader.java:587)
at java.lang.ClassLoader.loadClass(ClassLoader.java:827)
.
.
.
.
.
.
.
at org.eclipse.persistence.internal.jpa.weaving.PersistenceWeaver.transform(PersistenceWeaver.java:98)
at com.ibm.ws.jpa.management.JPAPUnitInfo.transformClass(JPAPUnitInfo.java:1987)
at com.ibm.ws.classloader.CompoundClassLoader._defineClass(CompoundClassLoader.java:851)
at com.ibm.ws.classloader.CompoundClassLoader.localFindClass(CompoundClassLoader.java:764)
at com.ibm.ws.classloader.CompoundClassLoader.loadClass(CompoundClassLoader.java:587)
at java.lang.ClassLoader.loadClass(ClassLoader.java:827)
at org.eclipse.persistence.jpa.PersistenceProvider.createContainerEntityManagerFactoryImpl(PersistenceProvider.java:379)
at org.eclipse.persistence.jpa.PersistenceProvider.createContainerEntityManagerFactory(PersistenceProvider.java:313)
at com.ibm.ws.jpa.management.JPAPUnitInfo.createEMFactory(JPAPUnitInfo.java:1584)
at com.ibm.ws.jpa.management.JPAPUnitInfo.createEntityManagerFactory(JPAPUnitInfo.java:1406)
at com.ibm.ws.jpa.management.JPAPxmlInfo.extractPersistenceUnits(JPAPxmlInfo.java:246)
at com.ibm.ws.jpa.management.JPAScopeInfo.processPersistenceUnit(JPAScopeInfo.java:119)
at com.ibm.ws.jpa.management.JPAApplInfo.processModulePUs(JPAApplInfo.java:167)
at com.ibm.ws.jpa.management.AbstractJPAComponent.startingModule(AbstractJPAComponent.java:451)
at com.ibm.ws.jpa.management.JPAComponentImpl.startingDeployedModule(JPAComponentImpl.java:771)
at com.ibm.ws.jpa.management.JPAComponentImpl.adjust(JPAComponentImpl.java:559)
at com.ibm.ws.runtime.component.ApplicationMgrImpl.adjust(ApplicationMgrImpl.java:1071)
at com.ibm.ws.runtime.component.DeployedApplicationImpl.fireDeployedObjectAdjust(DeployedApplicationImpl.java:1406)
at com.ibm.ws.runtime.component.DeployedModuleImpl.start(DeployedModuleImpl.java:627)
at com.ibm.ws.runtime.component.DeployedApplicationImpl.start(DeployedApplicationImpl.java:971)
... 13 more

在查看 jar 的反编译代码后,发现PersistenceProvider.createContainerEntityManagerFactoryImpl尝试加载调用ClassLoaderEntityManagerFactoryImpl。这反过来又将IBM称为CompoundClassLoader

这里它调用父 loadClass 方法,该方法抛出 ClassNotFoundException。因此,它进入 ini catch 块并调用 localFindClass。整个过程重复,最终抛出堆栈溢出异常。

这里的问题是,类加载器在加载PersistenceProvider时如何找不到EntityManagerFactoryImpl(Eclipselink.jar的一部分)(这也是Eclipselink.jar的一部分)。

只是为了历史,使用 2.4.2 并将目标放在持久性.xml,它奏效了。

<property name="eclipselink.target-server" value="WebSphere_7"/>

最新更新