appbundler
applications can use either an embedded Java 7 JRE inside the app bundle, or the Java 7 JRE installed in /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home
(the same one used by the web browser plugin). They can't use a JDK installed under /Library/Java/JavaVirtualMachines
(or anywhere else, for that matter) and they definitely can't use Java 6.
What you can do, however, is not use appbundler
and instead build the bundle by hand, with the main executable being a shell script that runs the java
command line tool from JAVA_HOME
(maybe falling back to the /Library/Internet Plug-Ins
JRE if JAVA_HOME
is not set). Such a script will be able to support both Java 6 and 7.
You would use something like this as YourApp.app/Contents/MacOS/YourApp
:
#!/bin/sh
PRG=$0
while [ -h "$PRG" ]; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '^.*-> \(.*\)$' 2>/dev/null`
if expr "$link" : '^/' 2> /dev/null >/dev/null; then
PRG="$link"
else
PRG="`dirname "$PRG"`/$link"
fi
done
progdir=`dirname "$PRG"`
if [ -n "$JAVA_HOME" ]; then
JAVACMD="$JAVA_HOME/bin/java"
elif [ -x /usr/libexec/java_home ]; then
JAVACMD="`/usr/libexec/java_home`/bin/java"
else
JAVACMD="/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java"
fi
exec "$JAVACMD" -classpath "$progdir/../Resources/Jars/*" \
-Dapple.laf.useScreenMenuBar=true \
my.pkg.MainClass
Then put your application's JAR files in YourApp.app/Contents/Resources/Jars
, the icon in YourApp.app/Contents/Resources/icon.icns
, and the following in YourApp.app/Contents/Info.plist
:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>YourApp</string><!-- relative to Contents/MacOS -->
<key>CFBundleGetInfoString</key>
<string>My clever application</string>
<key>CFBundleIconFile</key>
<string>icon.icns</string><!-- relative to Contents/Resources -->
<key>CFBundleInfoDictionaryVersion</key>
<string>8.0</string>
<key>CFBundleName</key>
<string>YourApp</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>8.0</string>
</dict>
</plist>
See the GATE Developer launcher for full details, though note that this is a slightly more convoluted case as the .app
script delegates to another script, which in turn loads the JAR files from a location that is outside the .app
bundle. The principle remains the same however.