eclipse启动排错

一模一样的环境(os/jvm/eclipse/user/directory/path等),将eclipse从一台机器移动到另一台机器就不能启动了。 查看了eclipse的几个输出文件,都没有什么异常。总是停留在装载workspace就不动了。即使将workspace删除了也不行。为了保留那些配置,决定不重装eclipse,研究下错误信息。 要研究此问题必须先拿到错误信息才行。eclipse屏蔽了stdout/stderr,导致没有什么信息。因此必须找到启动参数改变这种默认行为。 跑到另外一台可以允许的机器上启动后打开eclipse的帮助:

Workbench User Guide>Tasks>Running Eclipse

找到下面一个启动参数

-clean 清理eclipse以及osgi得缓存
-debug 调试启动
-consolelog 将日志重定向到控制台,需要-debug配合使用

接下来使用下面几个参数重新启动:

/home/adyliu/apps/eclipse -clean -debug -consolelog

再启动就能看到错误信息了:

!ENTRY com.collabnet.subversion.merge 4 0 2012-05-04 16:55:10.853
!MESSAGE
!STACK 0
java.lang.NullPointerException
at org.eclipse.jface.resource.JFaceResources.getResources(JFaceResources.java:207)
at org.eclipse.jface.resource.ImageRegistry.<init>(ImageRegistry.java:152)
at org.eclipse.jface.resource.ImageRegistry.<init>(ImageRegistry.java:124)
at org.eclipse.ui.internal.WorkbenchImages.initializeImageRegistry(WorkbenchImages.java:641)
at org.eclipse.ui.internal.WorkbenchImages.getDescriptors(WorkbenchImages.java:530)
at org.eclipse.ui.internal.WorkbenchImages.getImageDescriptor(WorkbenchImages.java:566)
at org.eclipse.ui.internal.SharedImages.getImageDescriptor(SharedImages.java:47)
at org.eclipse.ui.plugin.AbstractUIPlugin.imageDescriptorFromPlugin(AbstractUIPlugin.java:671)
at com.collabnet.subversion.merge.Activator.getMergeInputProviders(Activator.java:188)
at com.collabnet.subversion.merge.Activator.start(Activator.java:124)
at org.eclipse.osgi.framework.internal.core.BundleContextImpl$1.run(BundleContextImpl.java:711)
at java.security.AccessController.doPrivileged(Native Method)
……
at org.tigris.subversion.subclipse.ui.SVNUIPlugin.getMergeProviders(SVNUIPlugin.java:707)
at org.tigris.subversion.subclipse.ui.SVNUIPlugin.start(SVNUIPlugin.java:434)
at org.eclipse.osgi.framework.internal.core.BundleContextImpl$1.run(BundleContextImpl.java:711)
at java.security.AccessController.doPrivileged(Native Method)
……
at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243)
at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55)
at org.tigris.subversion.subclipse.core.SVNProviderPlugin.getMessageHandlers(SVNProviderPlugin.java:253)
at org.tigris.subversion.subclipse.core.SVNProviderPlugin.start(SVNProviderPlugin.java:164)
at org.eclipse.osgi.framework.internal.core.BundleContextImpl$1.run(BundleContextImpl.java:711)
at java.security.AccessController.doPrivileged(Native Method)
……
at org.eclipse.core.internal.refresh.RefreshJob.runInWorkspace(RefreshJob.java:167)
at org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:38)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)

从此错误信息中可以看出应该是subversion的插件subclipse崩溃了。 我想了下应该是缺少subversion的本地jni库导致的,当然也有可能是安装路径/配置什么的不一致。懒得研究了。 由于fedora16默认是1.6.x的subversion,为了使用subversion1.7.x single repository得特性,手动安装了fedora 17beta版的subversion,但是没有安装jni依赖库。

删除对应的插件后再启动就没有问题了。 我的疑问是:eclipse的osgi不是号称可以隔离插件么?怎么一个插件就导致eclipse不能启动了?这也太弱了吧。