I created a .jar that requires Java 7. I have Java 7 (JDK and JRE) and I can double-click to run the .jar. However, I want to package this into an application.
What I tried: Using Apple's Jar Bundler tool, I successfully created an application; however, when I run it, it quickly appears and disappears in the dock. When I run the internal file JavaApplicationStub
from Terminal, I get:
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/lcmmun/kiosk/gui/Kiosk : Unsupported major.minor version 51.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at apple.launcher.LaunchRunner.loadMainMethod(LaunchRunner.java:56)
at apple.launcher.LaunchRunner.run(LaunchRunner.java:112)
at apple.launcher.LaunchRunner.callMain(LaunchRunner.java:51)
at apple.launcher.JavaApplicationLauncher.launch(JavaApplicationLauncher.java:52)
which, according to "unsupportedclassversionerror unsupported major.minor version 51.0 unable to load class" means that I don't have Java 7 installed. But I do.
So my hypothesis is that JavaApplicationStub
is Java 7-incompatible.
I've also heard of an ANT task to accomplish the same task, but it seemed too complicated, and I don't know how to use ANT. If this really is the solution, though, I'd be happy to learn.
EDIT: I have now also tried Eclipse's Export > Other > Mac OS Application Bundle. This fails as well.
I'm running 10.8 Mountain Lion, 64-bit.
You are definitely right with your assumption that Apples JavaApplicationStub
located here:
System/Library/Frameworks/JavaVM.framework/Resources/MacOS/JavaApplicationStub
is only compatible with Apples own Java Packages build for Mac OS X.
Apple is discontinuing their own Java System Packages and only supports Java 6 in their fade out process. Oracle took now over and provides Java 7 for Mac OS X from 10.7.3 on. Apple is even discontinuing developer tools like Jar Bundler.app
without any notice, as you can see in this post:
Some people even tried desperately to manually increase the JVMVersion
property value in Info.plist
, read by Apples JavaApplicationStub
, from a documented literal 1.6
or 1.6+
to an undocumented literal like 1.7
. This won't work either and you will end up with a dialog like this, even if you have installed Oracles Java 7 Package.
So it is likely you will find other inconstancies between the retired Apple Java 6 world and the future Oracle Java 7 world.
To build an application packages based on Oracles Java 7 you need to use Oracles AppBundler Ant Task containing Oracles JavaAppLauncher
. This one now only supports Oracles Java 7 for Mac OS X and isn't backwards compatible with Apples own Java System Packages.
The good news now is, you can inline Oracles Java 7 JRE into your application package. It will be contained within the directory
Contents/PlugIns
in the application package, for example
Contents/PlugIns/jdk1.7.0_17.jdk
This means your application package is totally self contained and ready for App Store deployment.
But you don't have to do that. You could also rely on the installed Oracle Java 7 Package.
For a more detailed answer you should also checkout:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With