Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Starting hosted Eclipse instance immediately fails with java.lang.NoClassDefFoundError: org/springsource/loaded/ri/ReflectiveInterceptor #114

Open
fbricon opened this issue Apr 8, 2015 · 3 comments

Comments

@fbricon
Copy link

fbricon commented Apr 8, 2015

I'm trying to see if the Eclipse plug-in development experience could be enhanced by running hosted Eclipse instances with the spring-loaded agent.

When launching an Eclipse plugin as an Eclipse Application (using OSX 10.10.2, Eclipse Mars M5, Oracle JDK 1.8.0_40 or Oracle JDK 1.7.0_60), after adding the -javaagent:...springloaded-1.2.3.RELEASE.jar -noverify to the JVM arguments of the launch configuration, Eclipse fails fast :

 An error has occurred.  See the log file
 /Users/fbricon/Dev/workspaces/test/.metadata/.plugins/org.eclipse.pde.core/New_configuration/1428531082949.log

The log contains :

!MESSAGE Exception launching the Eclipse Platform:                                                    
!STACK                                                                                                
java.lang.NoClassDefFoundError: org/springsource/loaded/ri/ReflectiveInterceptor                      
  at org.eclipse.osgi.util.NLS.load(NLS.java:305)                                                     
  at org.eclipse.osgi.util.NLS.initializeMessages(NLS.java:143)                                       
  at org.eclipse.osgi.internal.messages.Msg.<clinit>(Msg.java:68)                                     
  at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:241)                     
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)                                      
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)                    
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)            
  at java.lang.reflect.Method.invoke(Method.java:497)                                                 
  at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1270)
  at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:648)                                 
  at org.eclipse.equinox.launcher.Main.basicRun(Main.java:603)                                        
  at org.eclipse.equinox.launcher.Main.run(Main.java:1465)                                            
  at org.eclipse.equinox.launcher.Main.main(Main.java:1438)                                           
Caused by: java.lang.ClassNotFoundException: org.springsource.loaded.ri.ReflectiveInterceptor         
  at java.net.URLClassLoader.findClass(URLClassLoader.java:381)                                       
  at java.lang.ClassLoader.loadClass(ClassLoader.java:424)                                            
  at java.lang.ClassLoader.loadClass(ClassLoader.java:357)                                            
... 13 more               

Starting with -Dspringloaded=verbose, a whole bunch of debug statements similar to this are displayed :

 [...]
 avr. 08, 2015 6:11:22 PM org.springsource.loaded.agent.SpringLoadedPreProcessor logPreProcess                                                                                                                                                            
 INFOS: SpringLoaded preprocessing: classname=sun/reflect/BootstrapConstructorAccessorImpl classloader=null typeRegistry=null                                                                                                                             
 avr. 08, 2015 6:11:22 PM org.springsource.loaded.agent.SpringLoadedPreProcessor logPreProcess                                                                                                                                                            
 INFOS: SpringLoaded preprocessing: classname=org/eclipse/core/runtime/adaptor/EclipseStarter classloader=Main$StartupClassLoader typeRegistry=TypeRegistry(id=117244645,loader=org.eclipse.equinox.launcher.Main$StartupClassLoader)                     
 avr. 08, 2015 6:11:22 PM org.springsource.loaded.agent.SpringLoadedPreProcessor logPreProcess                                                                                                                                                            
 INFOS: SpringLoaded preprocessing: classname=org/springsource/loaded/ri/ReflectiveInterceptor classloader=Launcher$AppClassLoader typeRegistry=TypeRegistry(id=519821334,loader=sun.misc.Launcher$AppClassLoader)                                        
 avr. 08, 2015 6:11:22 PM org.springsource.loaded.agent.SpringLoadedPreProcessor logPreProcess                                                                                                                                                            
 INFOS: SpringLoaded preprocessing: classname=org/springsource/loaded/NameRegistry classloader=Launcher$AppClassLoader typeRegistry=TypeRegistry(id=519821334,loader=sun.misc.Launcher$AppClassLoader)                                                    
 avr. 08, 2015 6:11:22 PM org.springsource.loaded.agent.SpringLoadedPreProcessor logPreProcess                                                                                                                                                            
 INFOS: SpringLoaded preprocessing: classname=java/util/concurrent/Semaphore classloader=null typeRegistry=null                                                                                                                                           
 avr. 08, 2015 6:11:22 PM org.springsource.loaded.agent.SpringLoadedPreProcessor logPreProcess                                                                                                                                                            
 INFOS: SpringLoaded preprocessing: classname=org/eclipse/core/runtime/adaptor/EclipseStarter$StartupEventListener classloader=Main$StartupClassLoader typeRegistry=TypeRegistry(id=117244645,loader=org.eclipse.equinox.launcher.Main$StartupClassLoader)
 avr. 08, 2015 6:11:22 PM org.springsource.loaded.agent.SpringLoadedPreProcessor logPreProcess                                                                                                                                                            
 INFOS: SpringLoaded preprocessing: classname=org/osgi/framework/SynchronousBundleListener classloader=Main$StartupClassLoader typeRegistry=TypeRegistry(id=117244645,loader=org.eclipse.equinox.launcher.Main$StartupClassLoader)                        
 avr. 08, 2015 6:11:22 PM org.springsource.loaded.agent.SpringLoadedPreProcessor logPreProcess                                                                                                                                                            
 INFOS: SpringLoaded preprocessing: classname=org/osgi/framework/BundleListener classloader=Main$StartupClassLoader typeRegistry=TypeRegistry(id=117244645,loader=org.eclipse.equinox.launcher.Main$StartupClassLoader)                                   
 avr. 08, 2015 6:11:22 PM org.springsource.loaded.agent.SpringLoadedPreProcessor logPreProcess                                                                                                                                                            
 INFOS: SpringLoaded preprocessing: classname=java/util/EventListener classloader=null typeRegistry=null
 [...]

It'd be nice if that could, you know, just work :-)

@ilx
Copy link

ilx commented Apr 9, 2015

@fbricon I wouldn't expect from javaagent to just work in OSGI land :)

Did you try to setup boot delegation?

Taken from jprofiler setup (I guess they would have similar issues):

-Xbootclasspath/a:${jprofiler.root.folder}\bin\agent.jar -Dorg.osgi.framework.bootdelegation=com.jprofiler.*

@fbricon
Copy link
Author

fbricon commented Apr 9, 2015

That spits a lot of errors in the logs :

INFOS: SpringLoaded preprocessing: classname=org/eclipse/e4/ui/workbench/renderers/swt/MenuManagerHideProcessor classloader=EquinoxClassLoader typeRegistry=TypeRegistry(id=964863654,loader=org.eclipse.osgi.internal.loader.EquinoxClassLoader)
java.lang.NullPointerException
  at org.springsource.loaded.agent.SpringLoadedPreProcessor.tryToEnsureSystemClassesInitialized(SpringLoadedPreProcessor.java:362)
  at org.springsource.loaded.agent.SpringLoadedPreProcessor.preProcess(SpringLoadedPreProcessor.java:128)
  at org.springsource.loaded.agent.ClassPreProcessorAgentAdapter.transform(ClassPreProcessorAgentAdapter.java:102)

NPE occurs at SpringLoadedPreProcessor.java:362 :

Class<?> clazz = SpringLoadedPreProcessor.class.getClassLoader().loadClass(classname.replace('/', '.'));

According to the getClassLoader() javadoc :

Returns the class loader for the class.  Some implementations may use
null to represent the bootstrap class loader. This method will return
null in such implementations if this class was loaded by the bootstrap class loader.

@aclement
Copy link
Contributor

aclement commented May 2, 2015

I put in a change for #116 that might affect things here too. People have tried in the past to use this with an Eclipse setup but it really wasn't engineered to cope with it. Possibly it just needs some tweaks around class loader delegation assumptions.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants