Skip to content
This repository was archived by the owner on Feb 4, 2023. It is now read-only.

Commit 2cd6a95

Browse files
author
Tobias Fischer
committed
Update README.md
1 parent 1e80f12 commit 2cd6a95

File tree

1 file changed

+29
-27
lines changed

1 file changed

+29
-27
lines changed

README.md

Lines changed: 29 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
universalJavaApplicationStub
22
=====================
33

4-
[![Join the chat at https://gitter.im/tofi86/universalJavaApplicationStub](https://badges.gitter.im/tofi86/universalJavaApplicationStub.svg)](https://gitter.im/tofi86/universalJavaApplicationStub?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
4+
[![Current release](https://img.shields.io/github/release/tofi86/universalJavaApplicationStub.svg)](https://github.com/tofi86/universalJavaApplicationStub/releases) [![Join the chat at https://gitter.im/tofi86/universalJavaApplicationStub](https://badges.gitter.im/tofi86/universalJavaApplicationStub.svg)](https://gitter.im/tofi86/universalJavaApplicationStub?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
55

66
A BASH based *JavaApplicationStub* for Java Apps on Mac OS X that works with both Apple's and Oracle's plist format. It is released under the MIT License.
77

@@ -13,34 +13,34 @@ Whilst developing some Java apps for Mac OS X I was facing the problem of suppor
1313

1414
**Is there some difference, you might ask?** Yes, there is!
1515

16-
1. The spot in the file system where the JRE or JDK is stored is different:
16+
1. The installation directory differs:
1717
* Apple Java 1.5/1.6: `/System/Library/Java/JavaVirtualMachines/`
1818
* Oracle JRE 1.7/1.8: `/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/`
1919
* Oracle JDK 1.7/1.8: `/System/Library/Java/JavaVirtualMachines/`
2020

21-
2. Mac Apps built with tools designed for Apple's Java (like Apple's JarBundler or the [ANT task "Jarbundler"](http://informagen.com/JarBundler/)) won't work on Macs with Oracle Java 7 and no Apple Java installed.
22-
* This is because the Apple `JavaApplicationStub` only works for Apple's Java and their `Info.plist` style to store Java properties.
23-
* To support Oracle Java 7 you would need to built a separate App package with Oracles [ANT task "Appbundler"](https://java.net/projects/appbundler).
21+
2. Mac Apps built with tools designed for Apple's Java (like Apple's *JarBundler* or the OpenSource [ANT task "Jarbundler"](https://github.com/UltraMixer/JarBundler)) won't work on Macs with Oracle Java 7 and no Apple Java installed.
22+
* This is because Apple's `JavaApplicationStub` only works for Apple's Java and their style to store Java properties in the `Info.plist` file.
23+
* To support Oracle Java 7 you would need to built a separate App package with [Oracles ANT task "Appbundler"](https://java.net/projects/appbundler).
2424
* Thus you would need the user to know which Java distribution he has installed on his Mac. Not very user friendly...
2525

2626
3. Oracle uses a different syntax to store Java properties in the applications `Info.plist` file. A Java app packaged as a Mac app with Oracles Appbundler also needs a different `JavaApplicationStub` and therefore won't work on systems with Apple's Java...
2727

28-
4. Starting with Mac OS X 10.10 *(Yosemite)*, app packages won't open up anymore if they contain the *deprecated* Plist `Java` dictionary. This isn't confirmed by Apple, but [issue #9](https://github.com/tofi86/universalJavaApplicationStub/issues/9) leads to this assumption:
29-
* Apple seems to declare the `Java` dictionary as *deprecated* and requires the old Apple Java 6 to be installed. Otherwise the app doesn't open.
28+
4. Starting with Mac OS X 10.10 *(Yosemite)*, Java Apps won't open anymore if they contain the *deprecated* Plist dictionary `Java`. This isn't confirmed by Apple, but [issue #9](https://github.com/tofi86/universalJavaApplicationStub/issues/9) leads to this assumption:
29+
* Apple seems to declare the `Java` dictionary as *deprecated* and ties it to the old Apple Java 6. If you have a newer version installed the app won't open.
3030
* If Java 7/8 is installed, Apple doesn't accept those java versions as suitable
3131
* Apple prompts for JRE 6 download even before the `JavaApplicationStub` is executed. This is why we can't intercept at this level and need to replace the `Java` dictionary by a `JavaX` dictionary key.
3232
* This requires to use the latest [JarBundler](https://github.com/UltraMixer/JarBundler/) version (see below for more details)
3333

3434
*So why, oh why, couldn't Oracle just use the old style of storing Java properties in `Info.plist` and offer a universal JavaApplicationStub?!* :rage:
3535

36-
Well, since I can't write such a script in C, C# or whatever fancy language, I wrote it as a shell script. And it works! ;-)
36+
Well, since I can't write such a script in C, C# or whatever fancy language, I wrote it as a Shell script. And it works!
3737

3838
How the script works
3939
--------------------
4040

41-
You don't need a native `JavaApplicationStub` file anymore...
41+
You don't need a native `JavaApplicationStub` file anymore. The Shell script needs to be executable – that's all.
4242

43-
The shell script reads JVM properties from `Info.plist` regardless of which format they have, Apple or Oracle, and feeds it to a commandline `java` call:
43+
The script reads JVM properties from `Info.plist` regardless of whether it's Apple or Oracle flavour and feeds it to a commandline `java` call like the following:
4444

4545
```Bash
4646
# execute Java and set
@@ -51,33 +51,37 @@ The shell script reads JVM properties from `Info.plist` regardless of which form
5151
# - JVM default options
5252
# - main class
5353
# - JVM arguments
54-
exec "$JAVACMD" \
55-
-cp "${JVMClassPath}" \
56-
-Xdock:icon="${ResourcesFolder}/${CFBundleIconFile}" \
57-
-Xdock:name="${CFBundleName}" \
58-
${JVMOptions:+$JVMOptions }\
59-
${JVMDefaultOptions:+$JVMDefaultOptions }\
60-
${JVMMainClass}\
61-
${JVMArguments:+ $JVMArguments}
54+
exec "$JAVACMD" \
55+
-cp "${JVMClassPath}" \
56+
-splash:"${ResourcesFolder}/${JVMSplashFile}" \
57+
-Xdock:icon="${ResourcesFolder}/${CFBundleIconFile}" \
58+
-Xdock:name="${CFBundleName}" \
59+
${JVMOptions:+$JVMOptions }\
60+
${JVMDefaultOptions:+$JVMDefaultOptions }\
61+
${JVMMainClass}\
62+
${JVMArguments:+ $JVMArguments}\
63+
${ArgsPassthru:+ $ArgsPassthru}
6264
```
6365

6466
It sets the classpath, the dock icon, the *AboutMenuName* (in Xdock style) and then every *JVMOptions*, *JVMDefaultOptions* or *JVMArguments* found in the `Info.plist` file.
6567

66-
The WorkingDirectory is either retrieved from Apple's `Info.plist` key `Java/WorkingDirectory` or set to the JavaRoot directory within the app bundle.
68+
The WorkingDirectory is either retrieved from Apple's Plist key `Java/WorkingDirectory` or set to the JavaRoot directory within the app bundle.
6769

68-
The name of the *main class* is also retrieved from `Info.plist`. If no *main class* could be found, an applescript error dialog is shown and the script exits with *exit code 1*.
70+
The name of the *main class* is also retrieved from `Info.plist`. If no *main class* is found, an applescript error dialog is shown and the script exits with *exit code 1*.
6971

7072
There is some *foo* happening to determine which Java versions are installed – here's the list in which order system properties are checked:
7173

72-
1. system variable `$JAVA_HOME`
74+
1. System variable `$JAVA_HOME`
7375
* can also be set to a relative path using the [`<LSEnvironment>` Plist dictionary key](https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/LaunchServicesKeys.html#//apple_ref/doc/uid/20001431-106825)
7476
* which allows for bundling a custom version of Java inside your app!
75-
2. highest available Java version found in one of these locations:
77+
2. Highest available Java version *(Java 8 trumps 7)* found in one of these locations:
7678
* `/usr/libexec/java_home` symlinks
7779
* Oracle's JRE Plugin: `/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java`
7880
* Symlink for old Apple Java: `/Library/Java/Home/bin/java`
81+
3. If you require a specific Java version with the Plist key `JVMVersion` the script will try to find a matching JDK or JRE in all of the above locations
82+
* if multiple matching JVM's are found, the script will pick the latest (highest version number)
7983

80-
If none of these could be found or executed, an applescript error dialog is shown saying that Java need to be installed:
84+
If none of these could be found or executed the script shows an applescript error dialog saying that Java needs to be installed:
8185

8286
![Error Dialog No Java Found](/docs/java-error.png?raw=true)
8387

@@ -90,7 +94,7 @@ Use whichever ANT task you like:
9094
* the opensource ["JarBundler"](https://github.com/UltraMixer/JarBundler) *(recommended)*
9195
* or my [JarBundler fork](https://github.com/tofi86/Jarbundler) *(deprecated)*
9296
* _both support the newly introduced and recommended `JavaX` dict key_
93-
* Oracle's opensource ["Appbundler"](https://java.net/projects/appbundler)
97+
* Oracle's opensource ["Appbundler"](https://java.net/projects/appbundler) *(seems to be dead)*
9498
* or [*infinitekind*'s fork](https://bitbucket.org/infinitekind/appbundler/overview)
9599

96100
### JarBundler (≥ v3.3) example
@@ -101,7 +105,7 @@ Download the latest JarBundler release [from its github repo](https://github.com
101105
>
102106
> If you don't want to care about compatibility issues between OS X and Java versions, make sure to use the [latest JarBundler version ≥ 3.3](https://github.com/UltraMixer/JarBundler/releases)
103107
104-
Then place the `universalJavaApplicationStub` from this repo in your build resources folder and link it in your ANT task (attribute `stubfile`). Don't forget to set the newly introduced `useJavaXKey` option:
108+
Then place the `universalJavaApplicationStub` from this repo in your build resources folder and link it in your ANT task (attribute `stubfile`). Don't forget to set the newly introduced `useJavaXKey` option for compatibility:
105109
```XML
106110
<jarbundler
107111
name="Your-App"
@@ -110,7 +114,6 @@ Then place the `universalJavaApplicationStub` from this repo in your build resou
110114
stubfile="${resources.dir}/universalJavaApplicationStub"
111115
useJavaXKey="true"
112116
... >
113-
114117
</jarbundler>
115118
```
116119

@@ -128,7 +131,6 @@ Just place the `universalJavaApplicationStub` from this repo in your build resou
128131
icon="${resources.dir}/icon.icns"
129132
executableName="${resources.dir}/universalJavaApplicationStub"
130133
... >
131-
132134
</appbundler>
133135
```
134136

0 commit comments

Comments
 (0)