Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [platform-core-dev] ClassCircularityError

This is a known bug in Eclipse.  To be more precise, this is a side-effect
of the behaviour of our class loaders that, while not strictly illegal, is
doing things that it really shouldn't be doing.  Basically, there are two
steps to loading a class: loading the byte-codes and initializing the
class.  These two steps are usually clearly separated -- a class and all of
its pre-requisites will be loaded before any initialization happens.  Our
class loader allows classes to be initialized while others are still on the
load stack.  If, during this initialization, a class is referenced that is
still on the load stack, this is interpretated by the VM as a circularity.
Basically, it looks like this: the VM is loading the pre-requisites of
class A, and while doing so, it encounters a request to load class A.  This
is interpretated as "class A is a pre-requisite of class A", and thus
reports it as a circularity error.

In Eclipse, this is manifested in exactly your scenario.  An attempt is
made to load plugin B, which triggers the loading of its prerequisite,
plugin A.  During loading of plugin A, your PluginA.startup() method is
attempting to instantiate extensions defined in Plugin B, and it hits the
circularity.  In your case, if plugin A happens to be referenced first, it
runs fine.  It only fails when there is an attempt to load plugin B
*before* plugin A has been loaded.

The bad news is that we have been unable to come up with an acceptable fix
for this.  The "workaround" is: please avoid doing complicated things in
your Plugin.startup() method, because it is prone to problems.  Especially,
avoid doing things that will trigger loading of plugins that require you.
If possible, move the code out of PluginA.startup(), and only load those
extensions lazily when actually needed.

See also the following bug report:

http://dev.eclipse.org/bugs/show_bug.cgi?id=5875
-




                                                                                                                      
                      Gunnar Wagenknecht                                                                              
                      <G.Wagenknecht@intershop        To:       "'platform-core-dev@xxxxxxxxxxx'"                     
                      .de>                             <platform-core-dev@xxxxxxxxxxx>                                
                      Sent by:                        cc:                                                             
                      platform-core-dev-admin@        Subject:  [platform-core-dev] ClassCircularityError             
                      eclipse.org                                                                                     
                                                                                                                      
                                                                                                                      
                      09/24/2002 05:34 AM                                                                             
                      Please respond to                                                                               
                      platform-core-dev                                                                               
                                                                                                                      
                                                                                                                      




The bug is something serious because I couldn't track it down to a usable
test case. It may be a possible design leak. But I'm not sure if it is an
Eclipse bug or a bug caused by our misunderstanding of the Eclipse boot
process.

We get a ClassCircularityError when starting the Workbench under certain
conditions. This is repeatable.

basis

(1) PlugIn A that introduces an extendable adapter mechanisme for its model
by extension points. This adapters are loaded using the class loader of
PlugIn A
(2) PlugIn B that defines adapters using this extention points for model
objects of PlugIn A.

No Error until here. This concept works very good with different kind of
adapters.

(3) PlugIn A defines an abstract base class "AbstractEditorInput", which
implements org.eclipse.ui.IEditorInput.
(4) PlugIn B defines a concrete class extending "AbstractEditorInput" and
registers this class via the extension point for a specific model object.
This class is used as IEditorInput for the editor defined in PlugIn B, too.

Still no error. Works quite well. The editor is build using GEF and our
custom IEditorInput was necessary to access the model object, which isn't
always a real file. But the Editor is usable via FileEditorInput, too.

On a regualary startup PlugIn A+B gets activated. During activation of
PlugIn A (PluginA#starup() method) it reads the extension points and loads
the classes. This works normally ok.

Now the problem.

When the workbench is closed and an Editor is left opened, it will be
restored next startup. But I couldn't be restored because our plugins get
deactivated because PlugIn A throws the CCError during loading of the
"AbstractEditorInput" class.

We think this is caused because of differnt class loaders or an
irregularity
in the class loaders but we havn't got an idea. Thus, I'm posting our
problem to this dev-list.

Is there anyone who can help us finding the problem?

Thanks, Gunnar


PS: I found 2 different stack traces.

java.version=1.4.1-beta
java.vendor=Sun Microsystems Inc.
BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=de_DE
Command-line arguments: -dev bin -data E:\eclipse\runtime-workspace -debug
file:y:
\rnd_beehive_source_eclipse_vob\plugins\.metadata\.plugins\org.eclips
e.pde.core\.options -os win32 -ws win32 -arch x86
!ENTRY org.eclipse.core.runtime 4 2 Sep 24, 2002 10:31:50.257
!MESSAGE Problems occurred when invoking code from plug-in:
"org.eclipse.core.runtime".
!STACK 0
java.lang.ClassCircularityError:
com/intershop/beehive/eclipse/core/common/BeehiveEditorInput
             at java.lang.ClassLoader.defineClass0(Native Method)
             at java.lang.ClassLoader.defineClass(ClassLoader.java:502)
             at
java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
             at
java.net.URLClassLoader.defineClass(URLClassLoader.java:250)
             at java.net.URLClassLoader.access$100(URLClassLoader.java:54)
             at java.net.URLClassLoader$1.run(URLClassLoader.java:193)
             at java.security.AccessController.doPrivileged(Native Method)
             at java.net.URLClassLoader.findClass(URLClassLoader.java:186)
             at
org.eclipse.core.internal.plugins.PluginClassLoader.findClassParentsSelf(Plu

ginClassLoader.java:112)
             at
org.eclipse.core.internal.boot.DelegatingURLClassLoader.loadClass(Delegating

URLClassLoader.java:750)
             at
org.eclipse.core.internal.boot.DelegatingURLClassLoader.loadClass(Delegating

URLClassLoader.java:730)
             at java.lang.ClassLoader.loadClass(ClassLoader.java:255)
             at
com.intershop.beehive.eclipse.core.common.extensionpoint.ClassElement.<init>

(ClassElement.java:37)
             at
com.intershop.beehive.eclipse.core.common.extensionpoint.BElementRefElement.

<init>(BElementRefElement.java:24)
             at
com.intershop.beehive.eclipse.core.common.extensionpoint.Adapter.<init>(Adap

ter.java:71)
             at
com.intershop.beehive.eclipse.core.common.extensionpoint.ElementManager.hand

leTag(ElementManager.java:199)
             at
com.intershop.beehive.eclipse.core.common.extensionpoint.ElementManager.<ini

t>(ElementManager.java:163)
             at
com.intershop.beehive.eclipse.core.common.extensionpoint.ElementManager.getI

nstance(ElementManager.java:220)
             at
com.intershop.beehive.eclipse.BeehivePlugin.startup(BeehivePlugin.java:497)
             at
org.eclipse.core.internal.plugins.PluginDescriptor$1.run(PluginDescriptor.ja

va:691)
             at
org.eclipse.core.internal.runtime.InternalPlatform.run(InternalPlatform.java

:839)
             at
org.eclipse.core.internal.plugins.PluginDescriptor.internalDoPluginActivatio

n(PluginDescriptor.java:703)
             at
org.eclipse.core.internal.plugins.PluginDescriptor.doPluginActivation(Plugin

Descriptor.java:183)
             at
org.eclipse.core.internal.plugins.PluginClassLoader.activatePlugin(PluginCla

ssLoader.java:58)
             at
org.eclipse.core.internal.plugins.PluginClassLoader.findClassParentsSelf(Plu

ginClassLoader.java:136)
             at
org.eclipse.core.internal.boot.DelegatingURLClassLoader.loadClass(Delegating

URLClassLoader.java:750)
             at
org.eclipse.core.internal.boot.DelegatingURLClassLoader.access$0(DelegatingU

RLClassLoader.java:744)
             at
org.eclipse.core.internal.boot.DelegatingURLClassLoader$DelegateLoader.loadC

lass(DelegatingURLClassLoader.java:70)
             at
org.eclipse.core.internal.boot.DelegatingURLClassLoader.findClassPrerequisit

es(DelegatingURLClassLoader.java:429)
             at
org.eclipse.core.internal.boot.DelegatingURLClassLoader.loadClass(Delegating

URLClassLoader.java:758)
             at
org.eclipse.core.internal.boot.DelegatingURLClassLoader.loadClass(Delegating

URLClassLoader.java:730)
             at java.lang.ClassLoader.loadClass(ClassLoader.java:255)
             at
java.lang.ClassLoader.loadClassInternal(ClassLoader.java:315)
             at java.lang.ClassLoader.defineClass0(Native Method)
             at java.lang.ClassLoader.defineClass(ClassLoader.java:502)
             at
java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
             at
java.net.URLClassLoader.defineClass(URLClassLoader.java:250)
             at java.net.URLClassLoader.access$100(URLClassLoader.java:54)
             at java.net.URLClassLoader$1.run(URLClassLoader.java:193)
             at java.security.AccessController.doPrivileged(Native Method)
             at java.net.URLClassLoader.findClass(URLClassLoader.java:186)
             at
org.eclipse.core.internal.plugins.PluginClassLoader.findClassParentsSelf(Plu

ginClassLoader.java:112)
             at
org.eclipse.core.internal.boot.DelegatingURLClassLoader.loadClass(Delegating

URLClassLoader.java:750)
             at
org.eclipse.core.internal.boot.DelegatingURLClassLoader.loadClass(Delegating

URLClassLoader.java:730)
             at java.lang.ClassLoader.loadClass(ClassLoader.java:255)
             at
java.lang.ClassLoader.loadClassInternal(ClassLoader.java:315)
             at
com.intershop.beehive.eclipse.vpm.PipelineEditor.setInput(PipelineEditor.jav

a:303)
             at
com.intershop.beehive.eclipse.vpm.PipelineEditor.init(PipelineEditor.java:23

8)
             at
org.eclipse.ui.internal.EditorManager.createSite(EditorManager.java:556)
             at
org.eclipse.ui.internal.EditorManager.openInternalEditor(EditorManager.java:

607)
             at
org.eclipse.ui.internal.EditorManager.access$6(EditorManager.java:603)
             at
org.eclipse.ui.internal.EditorManager$7.run(EditorManager.java:833)
             at
org.eclipse.core.internal.runtime.InternalPlatform.run(InternalPlatform.java

:839)
             at org.eclipse.core.runtime.Platform.run(Platform.java:416)
             at
org.eclipse.ui.internal.EditorManager.busyRestoreEditor(EditorManager.java:7

87)
             at
org.eclipse.ui.internal.EditorManager$6.run(EditorManager.java:780)
             at
org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:66)
             at
org.eclipse.ui.internal.EditorManager.restoreEditor(EditorManager.java:776)
             at
org.eclipse.ui.internal.EditorManager.restoreState(EditorManager.java:693)
             at
org.eclipse.ui.internal.WorkbenchPage.restoreState(WorkbenchPage.java:1898)
             at
org.eclipse.ui.internal.WorkbenchWindow.restoreState(WorkbenchWindow.java:10

72)
             at
org.eclipse.ui.internal.Workbench.restoreState(Workbench.java:1158)
             at
org.eclipse.ui.internal.Workbench.access$7(Workbench.java:1133)
             at org.eclipse.ui.internal.Workbench$6.run(Workbench.java:811)
             at
org.eclipse.core.internal.runtime.InternalPlatform.run(InternalPlatform.java

:839)
             at org.eclipse.core.runtime.Platform.run(Platform.java:416)
             at
org.eclipse.ui.internal.Workbench.openPreviousWorkbenchState(Workbench.java:

763)
             at org.eclipse.ui.internal.Workbench.init(Workbench.java:577)
             at org.eclipse.ui.internal.Workbench.run(Workbench.java:1232)
             at
org.eclipse.core.internal.boot.InternalBootLoader.run(InternalBootLoader.jav

a:775)
             at org.eclipse.core.boot.BootLoader.run(BootLoader.java:432)
             at EclipseRuntimeLauncher.main(EclipseRuntimeLauncher.java:24)
!SESSION Sep 24, 2002 10:34:51.363
---------------------------------------------


!ENTRY org.eclipse.core.runtime 4 2 Sep 24, 2002 11:18:37.888
!MESSAGE Problems occurred when invoking code from plug-in:
"org.eclipse.core.runtime".
!STACK 0
java.lang.ClassCircularityError:
com/intershop/beehive/eclipse/core/common/BeehiveEditorInput
             at java.lang.ClassLoader.defineClass0(Native Method)
             at java.lang.ClassLoader.defineClass(ClassLoader.java:502)
             at
java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
             at
java.net.URLClassLoader.defineClass(URLClassLoader.java:250)
             at java.net.URLClassLoader.access$100(URLClassLoader.java:54)
             at java.net.URLClassLoader$1.run(URLClassLoader.java:193)
             at java.security.AccessController.doPrivileged(Native Method)
             at java.net.URLClassLoader.findClass(URLClassLoader.java:186)
             at
org.eclipse.core.internal.plugins.PluginClassLoader.findClassParentsSelf(Plu

ginClassLoader.java:112)
             at
org.eclipse.core.internal.boot.DelegatingURLClassLoader.loadClass(Delegating

URLClassLoader.java:750)
             at
org.eclipse.core.internal.boot.DelegatingURLClassLoader.loadClass(Delegating

URLClassLoader.java:730)
             at java.lang.ClassLoader.loadClass(ClassLoader.java:255)
             at
com.intershop.beehive.eclipse.core.common.extensionpoint.ClassElement.<init>

(ClassElement.java:37)
             at
com.intershop.beehive.eclipse.core.common.extensionpoint.BElementRefElement.

<init>(BElementRefElement.java:24)
             at
com.intershop.beehive.eclipse.core.common.extensionpoint.Adapter.<init>(Adap

ter.java:71)
             at
com.intershop.beehive.eclipse.core.common.extensionpoint.ElementManager.hand

leTag(ElementManager.java:200)
             at
com.intershop.beehive.eclipse.core.common.extensionpoint.ElementManager.<ini

t>(ElementManager.java:164)
             at
com.intershop.beehive.eclipse.core.common.extensionpoint.ElementManager.getI

nstance(ElementManager.java:221)
             at
com.intershop.beehive.eclipse.BeehivePlugin.startup(BeehivePlugin.java:497)
             at
org.eclipse.core.internal.plugins.PluginDescriptor$1.run(PluginDescriptor.ja

va:691)
             at
org.eclipse.core.internal.runtime.InternalPlatform.run(InternalPlatform.java

:839)
             at
org.eclipse.core.internal.plugins.PluginDescriptor.internalDoPluginActivatio

n(PluginDescriptor.java:703)
             at
org.eclipse.core.internal.plugins.PluginDescriptor.doPluginActivation(Plugin

Descriptor.java:183)
             at
org.eclipse.core.internal.plugins.PluginClassLoader.activatePlugin(PluginCla

ssLoader.java:58)
             at
org.eclipse.core.internal.plugins.PluginClassLoader.findClassParentsSelf(Plu

ginClassLoader.java:136)
             at
org.eclipse.core.internal.boot.DelegatingURLClassLoader.loadClass(Delegating

URLClassLoader.java:750)
             at
org.eclipse.core.internal.boot.DelegatingURLClassLoader.access$0(DelegatingU

RLClassLoader.java:744)
             at
org.eclipse.core.internal.boot.DelegatingURLClassLoader$DelegateLoader.loadC

lass(DelegatingURLClassLoader.java:70)
             at
org.eclipse.core.internal.boot.DelegatingURLClassLoader.findClassPrerequisit

es(DelegatingURLClassLoader.java:429)
             at
org.eclipse.core.internal.boot.DelegatingURLClassLoader.loadClass(Delegating

URLClassLoader.java:758)
             at
org.eclipse.core.internal.boot.DelegatingURLClassLoader.loadClass(Delegating

URLClassLoader.java:730)
             at java.lang.ClassLoader.loadClass(ClassLoader.java:255)
             at
java.lang.ClassLoader.loadClassInternal(ClassLoader.java:315)
             at java.lang.Class.forName0(Native Method)
             at java.lang.Class.forName(Class.java:140)
             at
com.intershop.beehive.eclipse.vpm.VPMPlugin.startup(VPMPlugin.java:309)
             at
org.eclipse.core.internal.plugins.PluginDescriptor$1.run(PluginDescriptor.ja

va:691)
             at
org.eclipse.core.internal.runtime.InternalPlatform.run(InternalPlatform.java

:839)
             at
org.eclipse.core.internal.plugins.PluginDescriptor.internalDoPluginActivatio

n(PluginDescriptor.java:703)
             at
org.eclipse.core.internal.plugins.PluginDescriptor.doPluginActivation(Plugin

Descriptor.java:183)
             at
org.eclipse.core.internal.plugins.PluginClassLoader.activatePlugin(PluginCla

ssLoader.java:58)
             at
org.eclipse.core.internal.plugins.PluginClassLoader.findClassParentsSelf(Plu

ginClassLoader.java:136)
             at
org.eclipse.core.internal.boot.DelegatingURLClassLoader.loadClass(Delegating

URLClassLoader.java:750)
             at
org.eclipse.core.internal.boot.DelegatingURLClassLoader.loadClass(Delegating

URLClassLoader.java:730)
             at java.lang.ClassLoader.loadClass(ClassLoader.java:255)
             at
org.eclipse.core.internal.plugins.PluginDescriptor.createExecutableExtension

(PluginDescriptor.java:127)
             at
org.eclipse.core.internal.plugins.PluginDescriptor.createExecutableExtension

(PluginDescriptor.java:164)
             at
org.eclipse.core.internal.plugins.ConfigurationElement.createExecutableExten

sion(ConfigurationElement.java:102)
             at
org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:116)
             at
org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:66)
             at
org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java

:113)
             at
org.eclipse.ui.internal.EditorManager$3.run(EditorManager.java:617)
             at
org.eclipse.core.internal.runtime.InternalPlatform.run(InternalPlatform.java

:839)
             at org.eclipse.core.runtime.Platform.run(Platform.java:416)
             at
org.eclipse.ui.internal.EditorManager.createPart(EditorManager.java:615)
             at
org.eclipse.ui.internal.EditorManager.openInternalEditor(EditorManager.java:

605)
             at
org.eclipse.ui.internal.EditorManager.access$6(EditorManager.java:603)
             at
org.eclipse.ui.internal.EditorManager$7.run(EditorManager.java:833)
             at
org.eclipse.core.internal.runtime.InternalPlatform.run(InternalPlatform.java

:839)
             at org.eclipse.core.runtime.Platform.run(Platform.java:416)
             at
org.eclipse.ui.internal.EditorManager.busyRestoreEditor(EditorManager.java:7

87)
             at
org.eclipse.ui.internal.EditorManager$6.run(EditorManager.java:780)
             at
org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:66)
             at
org.eclipse.ui.internal.EditorManager.restoreEditor(EditorManager.java:776)
             at
org.eclipse.ui.internal.EditorManager.restoreState(EditorManager.java:693)
             at
org.eclipse.ui.internal.WorkbenchPage.restoreState(WorkbenchPage.java:1898)
             at
org.eclipse.ui.internal.WorkbenchWindow.restoreState(WorkbenchWindow.java:10

72)
             at
org.eclipse.ui.internal.Workbench.restoreState(Workbench.java:1158)
             at
org.eclipse.ui.internal.Workbench.access$7(Workbench.java:1133)
             at org.eclipse.ui.internal.Workbench$6.run(Workbench.java:811)
             at
org.eclipse.core.internal.runtime.InternalPlatform.run(InternalPlatform.java

:839)
             at org.eclipse.core.runtime.Platform.run(Platform.java:416)
             at
org.eclipse.ui.internal.Workbench.openPreviousWorkbenchState(Workbench.java:

763)
             at org.eclipse.ui.internal.Workbench.init(Workbench.java:577)
             at org.eclipse.ui.internal.Workbench.run(Workbench.java:1232)
             at
org.eclipse.core.internal.boot.InternalBootLoader.run(InternalBootLoader.jav

a:775)
             at org.eclipse.core.boot.BootLoader.run(BootLoader.java:432)
             at EclipseRuntimeLauncher.main(EclipseRuntimeLauncher.java:24)
_______________________________________________
platform-core-dev mailing list
platform-core-dev@xxxxxxxxxxx
http://dev.eclipse.org/mailman/listinfo/platform-core-dev






Back to the top