Community
Participate
Working Groups
Build: N20050506 If you startup a self-hosting workspace and then immediately shutdown, we found that JDT core is doing classpath container initialization from within its save participant. It is not illegal for the save participant to be doing this during shutdown, but presumably this case could be optimized to avoid container initialization. org.eclipse.core.internal.resources.Resource.touch(Resource.java:1401) at org.eclipse.core.internal.resources.Project.touch(Project.java:997) at org.eclipse.jdt.internal.core.SetClasspathOperation.executeOperation(SetClasspathOperation.java:287) at org.eclipse.jdt.internal.core.JavaModelOperation.run(JavaModelOperation.java:718) at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:1717) at org.eclipse.jdt.internal.core.JavaModelOperation.runOperation(JavaModelOperation.java:782) at org.eclipse.jdt.internal.core.JavaProject.setRawClasspath(JavaProject.java:2836) at org.eclipse.jdt.core.JavaCore$3.run(JavaCore.java:3845) at org.eclipse.jdt.internal.core.BatchOperation.executeOperation(BatchOperation.java:39) at org.eclipse.jdt.internal.core.JavaModelOperation.run(JavaModelOperation.java:718) at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:1717) at org.eclipse.jdt.core.JavaCore.run(JavaCore.java:3654) at org.eclipse.jdt.core.JavaCore.setClasspathContainer(JavaCore.java:3828) at org.eclipse.jdt.internal.launching.JREContainerInitializer.initialize(JREContainerInitializer.java:54) at org.eclipse.jdt.internal.core.JavaModelManager.initializeContainer(JavaModelManager.java:1421) at org.eclipse.jdt.internal.core.JavaModelManager.initializeAllContainers(JavaModelManager.java:1381) at org.eclipse.jdt.internal.core.JavaModelManager.getClasspathContainer(JavaModelManager.java:974) at org.eclipse.jdt.core.JavaCore.getClasspathContainer(JavaCore.java:1308) at org.eclipse.jdt.internal.core.JavaProject.getResolvedClasspath(JavaProject.java:2062) at org.eclipse.jdt.internal.core.JavaProject.getResolvedClasspath(JavaProject.java:1970) at org.eclipse.jdt.internal.core.DeltaProcessingState.initializeRoots(DeltaProcessingState.java:269) at org.eclipse.jdt.internal.core.JavaModelOperation.run(JavaModelOperation.java:715) at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:1717) at org.eclipse.jdt.core.JavaCore.run(JavaCore.java:3654) at org.eclipse.jdt.core.JavaCore.setClasspathContainer(JavaCore.java:3828) at org.eclipse.jdt.internal.launching.JREContainerInitializer.initialize(JREContainerInitializer.java:54) at org.eclipse.jdt.internal.core.JavaModelManager.initializeContainer(JavaModelManager.java:1421) at org.eclipse.jdt.internal.core.JavaModelManager.getClasspathContainer(JavaModelManager.java:976) at org.eclipse.jdt.core.JavaCore.getClasspathContainer(JavaCore.java:1308) at org.eclipse.jdt.internal.core.JavaProject.getResolvedClasspath(JavaProject.java:2062) at org.eclipse.jdt.internal.core.JavaProject.getResolvedClasspath(JavaProject.java:1970) at org.eclipse.jdt.core.JavaCore.setClasspathContainer(JavaCore.java:3819) at org.eclipse.pde.internal.core.SearchablePluginsManager.updateClasspathContainer(SearchablePluginsManager.java:175) at org.eclipse.pde.internal.core.ExternalJavaSearchInitializer.initialize(ExternalJavaSearchInitializer.java:35) at org.eclipse.jdt.internal.core.JavaModelManager.initializeContainer(JavaModelManager.java:1421) at org.eclipse.jdt.internal.core.JavaModelManager.getClasspathContainer(JavaModelManager.java:976) at org.eclipse.jdt.core.JavaCore.getClasspathContainer(JavaCore.java:1308) at org.eclipse.jdt.internal.core.JavaProject.getResolvedClasspath(JavaProject.java:2062) at org.eclipse.jdt.internal.core.JavaProject.getResolvedClasspath(JavaProject.java:1970) at org.eclipse.jdt.internal.core.search.JavaSearchScope.add(JavaSearchScope.java:108) at org.eclipse.jdt.internal.core.search.JavaWorkspaceScope.initialize(JavaWorkspaceScope.java:96) at org.eclipse.jdt.internal.core.search.JavaSearchScope.<init>(JavaSearchScope.java:62) at org.eclipse.jdt.internal.core.search.JavaSearchScope.<init>(JavaSearchScope.java:58) at org.eclipse.jdt.internal.core.search.JavaWorkspaceScope.<init>(JavaWorkspaceScope.java:42) at org.eclipse.jdt.internal.core.search.JavaWorkspaceScope.createScope(JavaWorkspaceScope.java:37) at org.eclipse.jdt.internal.core.search.BasicSearchEngine.createWorkspaceScope(BasicSearchEngine.java:157) at org.eclipse.jdt.internal.core.search.indexing.IndexManager.cleanUpIndexes(IndexManager.java:100) at org.eclipse.jdt.internal.core.JavaModelManager.saving(JavaModelManager.java:2013) at org.eclipse.core.internal.resources.SaveManager.executeLifecycle(SaveManager.java:314) at org.eclipse.core.internal.resources.SaveManager$1.run(SaveManager.java:146) at org.eclipse.core.internal.runtime.InternalPlatform.run(InternalPlatform.java:1031) at org.eclipse.core.runtime.Platform.run(Platform.java:757) at org.eclipse.core.internal.resources.SaveManager.broadcastLifecycle(SaveManager.java:149) at org.eclipse.core.internal.resources.SaveManager.save(SaveManager.java:942) at org.eclipse.core.internal.resources.Workspace.save(Workspace.java:1752) at org.eclipse.ui.internal.ide.IDEWorkbenchAdvisor$2.run(IDEWorkbenchAdvisor.java:291) at org.eclipse.jface.operation.ModalContext$ModalContextThread.run(ModalContext.java:113)
Is there any way that Platform can tell us it is a save during shutdown (and not a save in the middle of the session) ?
That's a good question. IWorkspace#save is API, so anybody can call it any time they want to. In practice, the IDE Workbench only ever calls save once, immediately before exiting the application. In this case the UI knows it is closing (IWorkbench.isClosing() returns true), but core doesn't know this. Is it difficult to always avoid classpath initialization during a full save callback (whenever JavaModelManager.saving is called)?
*** Bug 93286 has been marked as a duplicate of this bug. ***
*** Bug 95723 has been marked as a duplicate of this bug. ***
Changed JavaModelManager#saving(...) to not cleanupIndexes if the workspace scope has not been initialized. If the workspace scope is initialized, then all containers will be initialized. Added regression test ClasspathInitializerTests#testContainerInitializer11().
Verified in i20050527-0010