Starting Tomcat in Eclipse 4.6 doesn't work, neither with the new version 9.0.0 nor with the older 3.3.6.x I used before:
!ENTRY org.eclipse.ui 4 0 2016-06-14 16:24:07.896 !MESSAGE Unhandled event loop exception !STACK 0 java.lang.NullPointerException at net.sf.eclipse.tomcat.TomcatLauncherPlugin.log(TomcatLauncherPlugin.java:329) at net.sf.eclipse.tomcat.actions.StartActionDelegate.run(StartActionDelegate.java:41) at org.eclipse.ui.internal.PluginAction.runWithEvent(PluginAction.java:247) at org.eclipse.ui.internal.WWinPluginAction.runWithEvent(WWinPluginAction.java:228) at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:565) at org.eclipse.jface.action.ActionContributionItem.lambda$5(ActionContributionItem.java:436) at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4410) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079) at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4228) at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3816) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:687) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:604) at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) 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:498) at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) at org.eclipse.equinox.launcher.Main.run(Main.java:1519)
Reason:
The two log() methods in the TomcatLauncherPlugin class call org.eclipse.core.runtime.Plugin.getDescriptor() which is marked as deprecated and always returns null in Eclipse 4.6:
/** * As the org.eclipse.core.runtime.compatibility plug-in has been removed in * Eclipse 4.6 this method is not supported anymore. * * <code>IPluginDescriptor</code> was refactored in Eclipse 3.0. * * The <code>getDescriptor()</code> method was only be called by plug-ins * which explicitly require the org.eclipse.core.runtime.compatibility * plug-in. It is not called anymore. * * @deprecated */ @Deprecated public final IPluginDescriptor getDescriptor() { return null; }
Simple fix that WorksForMe(tm): Replace the two calls to getDescriptor() by toString():
diff --git a/net.sf.eclipse.tomcat/src/net/sf/eclipse/tomcat/TomcatLauncherPlugin.java b/net.sf.eclipse.tomcat/src/net/sf/eclipse/tomcat/TomcatLauncherPlugin.java index f06688a..b9fffae 100644 --- a/net.sf.eclipse.tomcat/src/net/sf/eclipse/tomcat/TomcatLauncherPlugin.java +++ b/net.sf.eclipse.tomcat/src/net/sf/eclipse/tomcat/TomcatLauncherPlugin.java @@ -326,7 +326,7 @@ static public void log(String msg) { ILog log = TomcatLauncherPlugin.getDefault().getLog(); - Status status = new Status(IStatus.ERROR, TomcatLauncherPlugin.getDefault().getDescriptor().getUniqueIdentifier(), IStatus.ERROR, msg + "\n", null); + Status status = new Status(IStatus.ERROR, TomcatLauncherPlugin.getDefault().toString(), IStatus.ERROR, msg + "\n", null); log.log(status); } @@ -336,7 +336,7 @@ ex.printStackTrace(new PrintWriter(stringWriter)); String msg = stringWriter.getBuffer().toString(); - Status status = new Status(IStatus.ERROR, TomcatLauncherPlugin.getDefault().getDescriptor().getUniqueIdentifier(), IStatus.ERROR, msg, null); + Status status = new Status(IStatus.ERROR, TomcatLauncherPlugin.getDefault().toString(), IStatus.ERROR, msg, null); log.log(status); }
I adjusted your fix a little bit to use a constant containing the plugin id and just released version 9.0.1. Thank you for your contribution, Thorsten!