Community
Participate
Working Groups
While using an objectdb (jdo-compliant) persistence layer as an Eclipse plugin, I am running into a problem loading some classes. Below is communication with the objectdb, which includes information about this issue. Please let me know if I may supply additional information. Thanks. -----Original Message----- From: support@objectdb.com Sent: Wednesday, July 30, 2003 2:38 PM To: Vladimir Gusev Subject: Re: ObjectDB Support Request - odbfe - 0.97 It is clear to me now that this is an Eclipse plugin bug - obviously it is Eclipse job to initialize the context class loader. I checked again and ObjectDB implements the JDO specification on this issue very precisely. You can report this bug to Eclipse team if you like, and meanwhile keep setting the context class loader by yourself BEFORE the first use of ObjectDB (not just before makePersistent). Ilan ----- Original Message ----- From: Vladimir Gusev To: support@objectdb.com Sent: Wednesday, July 30, 2003 8:14 PM Subject: RE: ObjectDB Support Request - odbfe - 0.97 Ilan, Either of these solutions worked. Thanks a lot. Vladimir -----Original Message----- From: support@objectdb.com Sent: Wednesday, July 30, 2003 11:47 AM To: Vladimir Gusev Subject: Re: ObjectDB Support Request - odbfe - 0.97 The stack trace is very useful and I can see now where the exception is thrown. From some unknown reason, com.graphlogic.pc.PersistanceClass is not found by the thread's context class loader (as expected by the JDO specification) - maybe the thread's context class loader is not initialized well by Eclipse plugin runner. Please try the following workaround, before calling makePersistent: Thread.currentThread().setContextClassLoader (PersistanceClass.class.getClassLoader()); Or maybe: Thread.currentThread().setContextClassLoader(getClass().getClassLoader()); Please tell me what you found. Ilan ----- Original Message ----- From: Vladimir Gusev To: support@objectdb.com Sent: Wednesday, July 30, 2003 6:05 PM Subject: RE: ObjectDB Support Request - odbfe - 0.97 Here is the output on my console (the first line is printed while getting persistence manager) – the rest on executing “pm.makePersistent(process);” line Vladimir Database 'c:\GLJDO.odb' is ready now... java.lang.ClassNotFoundException: com.graphlogic.pc.PersistanceClass at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClassInternal(Unknown Source) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) at com.objectdb.core.type.TypeManager.loadPersistentClass (TypeManager.java:227) at com.objectdb.core.type.PersistentTypeInfo.getTypeClass (PersistentTypeInfo.java:564) at com.objectdb.core.type.PersistentTypeInfo.<init> (PersistentTypeInfo.java:290) at com.objectdb.core.type.TypeManager.getTypeInfo(TypeManager.java:308) at com.objectdb.core.type.PersistentTypeInfo.readVersion (PersistentTypeInfo.java:667) at com.objectdb.core.type.PersistentTypeInfo.<init> (PersistentTypeInfo.java:286) at com.objectdb.core.type.TypeManager.loadUserVersion (TypeManager.java:489) at com.objectdb.core.type.TypeManager.getTypeInfo(TypeManager.java:400) at com.objectdb.core.type.TypeManager.getTypeInfoByObj (TypeManager.java:339) at com.objectdb.core.object.ObjectManager.startManaging (ObjectManager.java:858) at com.objectdb.core.object.ObjectManager.makePersistent (ObjectManager.java:493) at com.objectdb.jdo.PMImpl.doOperation(PMImpl.java:690) at com.objectdb.jdo.PMImpl.doSimpleOperation(PMImpl.java:603) at com.objectdb.jdo.PMImpl.makePersistent(PMImpl.java:274) at com.graphlogic.eclipse.views.navigator.treeviewer.ui.MovingBoxView.addSamplePro cessPersistanceObject(MovingBoxView.java:324) at com.graphlogic.eclipse.views.navigator.treeviewer.ui.MovingBoxView.getInitalInp ut(MovingBoxView.java:342) at com.graphlogic.eclipse.views.navigator.treeviewer.ui.MovingBoxView.createPartCo ntrol(MovingBoxView.java:104) at org.eclipse.ui.internal.PartPane$4.run(PartPane.java:141) at org.eclipse.core.internal.runtime.InternalPlatform.run (InternalPlatform.java:1006) at org.eclipse.core.runtime.Platform.run(Platform.java:413) at org.eclipse.ui.internal.PartPane.createChildControl(PartPane.java:137) at org.eclipse.ui.internal.ViewPane.createChildControl(ViewPane.java:211) at org.eclipse.ui.internal.PartPane.createControl(PartPane.java:186) at org.eclipse.ui.internal.ViewPane.createControl(ViewPane.java:190) at org.eclipse.ui.internal.PartTabFolder.createPartTab (PartTabFolder.java:252) at org.eclipse.ui.internal.PartTabFolder.createControl (PartTabFolder.java:224) at org.eclipse.ui.internal.PartSashContainer.createControl (PartSashContainer.java:192) at org.eclipse.ui.internal.PerspectivePresentation.activate (PerspectivePresentation.java:96) at org.eclipse.ui.internal.Perspective.onActivate(Perspective.java:725) at org.eclipse.ui.internal.WorkbenchPage.onActivate (WorkbenchPage.java:1799) at org.eclipse.ui.internal.WorkbenchWindow$7.run (WorkbenchWindow.java:1496) at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:69) at org.eclipse.ui.internal.WorkbenchWindow.setActivePage (WorkbenchWindow.java:1483) at org.eclipse.ui.internal.WorkbenchWindow.restoreState (WorkbenchWindow.java:1363) at org.eclipse.ui.internal.Workbench.restoreState(Workbench.java:1263) at org.eclipse.ui.internal.Workbench.access$10(Workbench.java:1223) at org.eclipse.ui.internal.Workbench$12.run(Workbench.java:1141) at org.eclipse.core.internal.runtime.InternalPlatform.run (InternalPlatform.java:1006) at org.eclipse.core.runtime.Platform.run(Platform.java:413) at org.eclipse.ui.internal.Workbench.openPreviousWorkbenchState (Workbench.java:1093) at org.eclipse.ui.internal.Workbench.init(Workbench.java:870) at org.eclipse.ui.internal.Workbench.run(Workbench.java:1373) at org.eclipse.core.internal.boot.InternalBootLoader.run (InternalBootLoader.java:858) at org.eclipse.core.boot.BootLoader.run(BootLoader.java:461) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.eclipse.core.launcher.Main.basicRun(Main.java:291) at org.eclipse.core.launcher.Main.run(Main.java:747) at org.eclipse.core.launcher.Main.main(Main.java:583) java.lang.ClassNotFoundException: com.graphlogic.pc.PersistanceClass at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClassInternal(Unknown Source) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) at com.objectdb.core.type.TypeManager.loadPersistentClass (TypeManager.java:227) at com.objectdb.core.type.PersistentTypeInfo.getTypeClass (PersistentTypeInfo.java:564) at com.objectdb.core.type.PersistentTypeInfo.checkUpToDate (PersistentTypeInfo.java:321) at com.objectdb.core.type.PersistentTypeInfo.<init> (PersistentTypeInfo.java:294) at com.objectdb.core.type.TypeManager.getTypeInfo(TypeManager.java:308) at com.objectdb.core.type.PersistentTypeInfo.readVersion (PersistentTypeInfo.java:667) at com.objectdb.core.type.PersistentTypeInfo.<init> (PersistentTypeInfo.java:286) at com.objectdb.core.type.TypeManager.loadUserVersion (TypeManager.java:489) at com.objectdb.core.type.TypeManager.getTypeInfo(TypeManager.java:400) at com.objectdb.core.type.TypeManager.getTypeInfoByObj (TypeManager.java:339) at com.objectdb.core.object.ObjectManager.startManaging (ObjectManager.java:858) at com.objectdb.core.object.ObjectManager.makePersistent (ObjectManager.java:493) at com.objectdb.jdo.PMImpl.doOperation(PMImpl.java:690) at com.objectdb.jdo.PMImpl.doSimpleOperation(PMImpl.java:603) at com.objectdb.jdo.PMImpl.makePersistent(PMImpl.java:274) at com.graphlogic.eclipse.views.navigator.treeviewer.ui.MovingBoxView.addSamplePro cessPersistanceObject(MovingBoxView.java:324) at com.graphlogic.eclipse.views.navigator.treeviewer.ui.MovingBoxView.getInitalInp ut(MovingBoxView.java:342) at com.graphlogic.eclipse.views.navigator.treeviewer.ui.MovingBoxView.createPartCo ntrol(MovingBoxView.java:104) at org.eclipse.ui.internal.PartPane$4.run(PartPane.java:141) at org.eclipse.core.internal.runtime.InternalPlatform.run (InternalPlatform.java:1006) at org.eclipse.core.runtime.Platform.run(Platform.java:413) at org.eclipse.ui.internal.PartPane.createChildControl(PartPane.java:137) at org.eclipse.ui.internal.ViewPane.createChildControl(ViewPane.java:211) at org.eclipse.ui.internal.PartPane.createControl(PartPane.java:186) at org.eclipse.ui.internal.ViewPane.createControl(ViewPane.java:190) at org.eclipse.ui.internal.PartTabFolder.createPartTab (PartTabFolder.java:252) at org.eclipse.ui.internal.PartTabFolder.createControl (PartTabFolder.java:224) at org.eclipse.ui.internal.PartSashContainer.createControl (PartSashContainer.java:192) at org.eclipse.ui.internal.PerspectivePresentation.activate (PerspectivePresentation.java:96) at org.eclipse.ui.internal.Perspective.onActivate(Perspective.java:725) at org.eclipse.ui.internal.WorkbenchPage.onActivate (WorkbenchPage.java:1799) at org.eclipse.ui.internal.WorkbenchWindow$7.run (WorkbenchWindow.java:1496) at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:69) at org.eclipse.ui.internal.WorkbenchWindow.setActivePage (WorkbenchWindow.java:1483) at org.eclipse.ui.internal.WorkbenchWindow.restoreState (WorkbenchWindow.java:1363) at org.eclipse.ui.internal.Workbench.restoreState(Workbench.java:1263) at org.eclipse.ui.internal.Workbench.access$10(Workbench.java:1223) at org.eclipse.ui.internal.Workbench$12.run(Workbench.java:1141) at org.eclipse.core.internal.runtime.InternalPlatform.run (InternalPlatform.java:1006) at org.eclipse.core.runtime.Platform.run(Platform.java:413) at org.eclipse.ui.internal.Workbench.openPreviousWorkbenchState (Workbench.java:1093) at org.eclipse.ui.internal.Workbench.init(Workbench.java:870) at org.eclipse.ui.internal.Workbench.run(Workbench.java:1373) at org.eclipse.core.internal.boot.InternalBootLoader.run (InternalBootLoader.java:858) at org.eclipse.core.boot.BootLoader.run(BootLoader.java:461) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.eclipse.core.launcher.Main.basicRun(Main.java:291) at org.eclipse.core.launcher.Main.run(Main.java:747) at org.eclipse.core.launcher.Main.main(Main.java:583) java.lang.NullPointerException at javax.jdo.spi.JDOImplHelper.getMeta(Unknown Source) at javax.jdo.spi.JDOImplHelper.newInstance(Unknown Source) at com.objectdb.core.type.PersistentTypeInfo.<init> (PersistentTypeInfo.java:296) at com.objectdb.core.type.TypeManager.getTypeInfo(TypeManager.java:308) at com.objectdb.core.type.PersistentTypeInfo.readVersion (PersistentTypeInfo.java:667) at com.objectdb.core.type.PersistentTypeInfo.<init> (PersistentTypeInfo.java:286) at com.objectdb.core.type.TypeManager.loadUserVersion (TypeManager.java:489) at com.objectdb.core.type.TypeManager.getTypeInfo(TypeManager.java:400) at com.objectdb.core.type.TypeManager.getTypeInfoByObj (TypeManager.java:339) at com.objectdb.core.object.ObjectManager.startManaging (ObjectManager.java:858) at com.objectdb.core.object.ObjectManager.makePersistent (ObjectManager.java:493) at com.objectdb.jdo.PMImpl.doOperation(PMImpl.java:690) at com.objectdb.jdo.PMImpl.doSimpleOperation(PMImpl.java:603) at com.objectdb.jdo.PMImpl.makePersistent(PMImpl.java:274) at com.graphlogic.eclipse.views.navigator.treeviewer.ui.MovingBoxView.addSamplePro cessPersistanceObject(MovingBoxView.java:324) at com.graphlogic.eclipse.views.navigator.treeviewer.ui.MovingBoxView.getInitalInp ut(MovingBoxView.java:342) at com.graphlogic.eclipse.views.navigator.treeviewer.ui.MovingBoxView.createPartCo ntrol(MovingBoxView.java:104) at org.eclipse.ui.internal.PartPane$4.run(PartPane.java:141) at org.eclipse.core.internal.runtime.InternalPlatform.run (InternalPlatform.java:1006) at org.eclipse.core.runtime.Platform.run(Platform.java:413) at org.eclipse.ui.internal.PartPane.createChildControl(PartPane.java:137) at org.eclipse.ui.internal.ViewPane.createChildControl(ViewPane.java:211) at org.eclipse.ui.internal.PartPane.createControl(PartPane.java:186) at org.eclipse.ui.internal.ViewPane.createControl(ViewPane.java:190) at org.eclipse.ui.internal.PartTabFolder.createPartTab (PartTabFolder.java:252) at org.eclipse.ui.internal.PartTabFolder.createControl (PartTabFolder.java:224) at org.eclipse.ui.internal.PartSashContainer.createControl (PartSashContainer.java:192) at org.eclipse.ui.internal.PerspectivePresentation.activate (PerspectivePresentation.java:96) at org.eclipse.ui.internal.Perspective.onActivate(Perspective.java:725) at org.eclipse.ui.internal.WorkbenchPage.onActivate (WorkbenchPage.java:1799) at org.eclipse.ui.internal.WorkbenchWindow$7.run (WorkbenchWindow.java:1496) at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:69) at org.eclipse.ui.internal.WorkbenchWindow.setActivePage (WorkbenchWindow.java:1483) at org.eclipse.ui.internal.WorkbenchWindow.restoreState (WorkbenchWindow.java:1363) at org.eclipse.ui.internal.Workbench.restoreState(Workbench.java:1263) at org.eclipse.ui.internal.Workbench.access$10(Workbench.java:1223) at org.eclipse.ui.internal.Workbench$12.run(Workbench.java:1141) at org.eclipse.core.internal.runtime.InternalPlatform.run (InternalPlatform.java:1006) at org.eclipse.core.runtime.Platform.run(Platform.java:413) at org.eclipse.ui.internal.Workbench.openPreviousWorkbenchState (Workbench.java:1093) at org.eclipse.ui.internal.Workbench.init(Workbench.java:870) at org.eclipse.ui.internal.Workbench.run(Workbench.java:1373) at org.eclipse.core.internal.boot.InternalBootLoader.run (InternalBootLoader.java:858) at org.eclipse.core.boot.BootLoader.run(BootLoader.java:461) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.eclipse.core.launcher.Main.basicRun(Main.java:291) at org.eclipse.core.launcher.Main.run(Main.java:747) at org.eclipse.core.launcher.Main.main(Main.java:583)
It seems to me that the solution is very simple. Probably one of the Eclipse methods which are mentioned in the stack trace bellow should initialize the context class loader using: Thread.currentThread().setContextClassLoader(...); Otherwise, no JDO implementation will work from a plugin directly (unless using the workaround mentioned bellow). Setting the context class loader is also done in other environments in which a new thread is assigned to do some user work (with a user private classpath), like in web servers and in application servers. Ilan Kirsh ObjectDB Software http://www.objectdb.com
This is a known issue in Eclipse, and unfortunately your workaround is the way to go. For details see: bug 8907, bug 37441 and bug 30588. *** This bug has been marked as a duplicate of 8907 ***
Thread.setContextLoader() solution works only if all the persistent capable classes are present in the same plugin. You can do a set contextloader to point the correct plugin classloader while loading each of the classes, however if u have inheritance with super-class in one plugin and subclass in another plugin, chances are that you will never get this work. This is primarily because the persistent-capable subclass uses the persistent-capable superclass to load itself. Solution for this problem has to be provided by jdo vendors, and the workaround wud be to use interface instead of a concrete super-class. Balaji Kandan w: http://www.orangescape.com