mongrel tomcat launcher not working on neon

Edit: The solution is here

I used to use sydeo to launch Tomcat and then switched to Mongrel which I’ve been using for a few years. I had trouble with Mongrel in Eclipse Neon.

Symptoms

  • Clicking Start – get pop up with “The chosen operation is not available” and “Plugin net.sf.mongrel.plugin was unable to load class net.sf.mongrel.actions.StartActionDelegate” in the Eclipse log
  • Clicking Restart – get pop up with “The chosen operation is not available” and “Plugin net.sf.mongrel.plugin was unable to load class net.sf.mongrel.actions.RestartActionDelegate” in the Eclipse log
  • Clicking Stop – get pop up with “The chosen operation is not available” and “Plugin net.sf.mongrel.plugin was unable to load class net.sf.mongrel.actions.StopActionDelegate” in the Eclipse log
  • Opening Mongrel in the Eclipse preferences – get “An error has occurred while creating this preference page” and “Unable to create the selected preference page. An error occurred while automatically activating bundle net.sf.mongrel.plugin (1288).” The full Eclipse message in the error log is at the bottom of this post.

Attempt at solving

I checked the update site from Marketplace (by pasting the update site into “install new software” into Eclipse) and saw that there is only one version of Mongrel available. So it isn’t that I’m not using the latest version. I also tried uninstalling Mongrel and re-installing it. Nope. (You can uninstall a plugin through Marketplace if you installed it that way). Nothing.

I also learned I’m not the only one with this problem.

Workaround

The workaround is to use the WTP (web tool plugin) that comes with Eclipse as described here. Not a big deal. I just like the single button approach. I had upgraded to Java 8 since I last used WTP so I immediately got “unable to start Tomcat” with this log message in the console:

java.lang.UnsupportedClassVersionError: com/javaranch/jforum/csrf/CsrfListener : Unsupported major.minor version 52.0 (unable to load class com.javaranch.jforum.csrf.CsrfListener)

It was immediately obvious to me that WTP was pointing to Java 7 since I successfully launched this project in Mars a few days ago. I clicked on “runtime” in the Tomcat profile and choose Java 8 from the pull down. This updated the classpath and then I was successful.

Full message in case curious

eclipse.buildId=4.6.0.I20160606-1100

java.version=1.8.0_45

java.vendor=Oracle Corporation

BootLoader constants: OS=macosx, ARCH=x86_64, WS=cocoa, NL=en_US

Framework arguments:  -product org.eclipse.epp.package.jee.product -product org.eclipse.epp.package.jee.product -product org.eclipse.epp.package.jee.product -keyring /Users/nyjeanne/.eclipse_keyring

Command-line arguments:  -os macosx -ws cocoa -arch x86_64 -product org.eclipse.epp.package.jee.product -product org.eclipse.epp.package.jee.product -data file:/Users/nyjeanne/Documents/workspace/ -product org.eclipse.epp.package.jee.product -keyring /Users/nyjeanne/.eclipse_keyring

org.eclipse.equinox.registry

Error

Fri Jun 24 10:48:29 EDT 2016

Unable to create the selected preference page.

java.lang.ClassNotFoundException: An error occurred while automatically activating bundle net.sf.mongrel.plugin (975).

at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116)

at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529)

at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325)

at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:334)

at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:411)

at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:361)

at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:353)

at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161)

at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564)

at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174)

at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905)

at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243)

at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55)

at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291)

at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)

at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286)

at org.eclipse.ui.internal.PluginAction.createDelegate(PluginAction.java:122)

at org.eclipse.ui.internal.PluginAction.runWithEvent(PluginAction.java:219)

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.jface.action.ActionContributionItem$$Lambda$34/501727405.handleEvent(Unknown Source)

at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)

at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4248)

at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1501)

at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1524)

at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1509)

at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:1313)

at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4072)

at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3698)

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:497)

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)

Caused by: org.osgi.framework.BundleException: Error loading bundle activator.

at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:716)

at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932)

at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309)

at org.eclipse.osgi.container.Module.doStart(Module.java:581)

at org.eclipse.osgi.container.Module.start(Module.java:449)

at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470)

at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107)

… 51 more

Caused by: java.lang.ClassNotFoundException: org.eclipse.core.internal.compatibility.PluginActivator cannot be found by net.sf.mongrel.plugin_1.0.0.201101221622

at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:448)

at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:361)

at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:353)

at org.eclipse.osgi.internal.framework.BundleContextImpl.loadBundleActivator(BundleContextImpl.java:757)

at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:711)

… 57 more

eclipse mars (4.5) and trouble connecting to subversion

Every year, I create a blog post about the latest version of Eclipse. While this post is about Eclipse Mars (4.5), it is not that post. This post is about my troubles connecting to Subversion using Eclipse. Which was unexpected as I’ve never had that problem before.

After installing Subversive, I restarted Eclipse. I then got prompted for installing a SVN Connector. I chose the first one (SVN Kit 1.7). I don’t know what happened; it didn’t work.

Unsuccessful attempts

I then went to the workspace preferences > team > svn and clicked add connectors to get the prompt again. I wanted to choose SVN Kit 1.8. Unfortunately I clicked Javahl by accident. Which of course didn’t work because it I don’t have SVN natively installed.

The error I got for Javahl was at least clear:

SVN: ‘0x00400104: Check HEAD Revision’ operation finished with error: Selected SVN connector library is not available or cannot be loaded.
If you selected native JavaHL connector, please check if binaries are available or install and select pure Java Subversion connector from the plug-in connectors update site.
If connectors already installed then you can change the selected one at: Window->Preferences->Team->SVN->SVN Connector.
Get log messages for ‘https://svn.javaranch.com/svn’ failed.
Selected SVN connector library is not available or cannot be loaded.
If you selected native JavaHL connector, please check if binaries are available or install and select pure Java Subversion connector from the plug-in connectors update site.
If connectors already installed then you can change the selected one at: Window->Preferences->Team->SVN->SVN Connector.

Selected SVN connector library is not available or cannot be loaded.
If you selected native JavaHL connector, please check if binaries are available or install and select pure Java Subversion connector from the plug-in connectors update site.
If connectors already installed then you can change the selected one at: Window->Preferences->Team->SVN->SVN Connector.

No problem. I’ll just go back there and click add connectors again. Nothing. Can’t get pop-up to show up. I unsuccessfully tried restarting. Then I decided to uninstall Subversive entirely and start over.

Uninstalling

I went to help > installation details > subversive and clicked all subversive one. I then uninstalled. This was unnecessary as the problem was a connector. I then did help > installation details > javahl and uninstalled. After re-starting Eclipse, I got the connectors pop-up back.

Third attempt?

The connectors pop-up came back. SVN Kit 1.7 failed again. I then tried SVN Kit 1.8 which gave me an error about there not being any connectors. I restarted yet again and was finally able to connect to SVN. I’m not sure why this worked. I suppose the lesson is to uninstall and keep rebooting until it works?

 

Eclipse – easily looking at Java bytecode

A fellow moderator asked me to weigh in on this question at CodeRanch. The gist is whether this code creates one String or two:

String s = " " + 3;

How to find out the answer

The most definitive way to verify this is to check the bytecode. I had downloaded the bytecode plugin when working on our Java 8 OCA Study Guide because sometimes you just have to know what actually goes on behind the scenes to be accurate.

Using the plugin is easy. You go to Window -> Show View -> Other -> Java -> Bytecode. Then every time you save the Java file, the bytecode window is automatically updated. Great for lots of iterations.

The test

I wrote a simple Java class:

package jb;
public class PlayTest {
  public static void main(String[] args) {
    String s = "" + 3;
  }
}

The generated bytecode is:

// class version 52.0 (52)
// access flags 0x21
public class jb/PlayTest {

  // compiled from: PlayTest.java

  // access flags 0x1
  public <init>()V
   L0
    LINENUMBER 4 L0
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init> ()V
    RETURN
   L1
    LOCALVARIABLE this Ljb/PlayTest; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1

  // access flags 0x9
  public static main([Ljava/lang/String;)V
   L0
    LINENUMBER 8 L0
    LDC "3"
    ASTORE 1
   L1
    LINENUMBER 14 L1
    RETURN
   L2
    LOCALVARIABLE args [Ljava/lang/String; L0 L2 0
    LOCALVARIABLE s Ljava/lang/String; L1 L2 1
    MAXSTACK = 1
    MAXLOCALS = 2
}