Recently we extended our enterprise search engine bleen adding a desktop utility automatically launched clicking on a result link.
To achieve this we created a native applciation ( for windows and osx ) registered to the protocol url bleen://
In this tutorial we will see how to build this utility in Java for Mac OS X.
The base code is a simple java class displaying a Dialog
Application bundle
Creating a OSX application bundle is as easy as creating a directory structure following some simple rules.
Out directory tree will contain :
- a jar with out classes
- the dependency jars
- the info.plist file
- a native executable
The following is a ant tast that creates the dir tree.
<target name="application-bundle" depends="jar" description="create mac Os X Application bundle">
<mkdir dir="${dist.appbundle}/Contents/MacOS" />
<mkdir dir="${dist.appbundle}/Contents/Resources/Java" />
<copy file="${auxes.dir}/JavaApplicationStub" todir="${dist.appbundle}/Contents/MacOS" />
<exec executable="chmod">
<arg value="755" />
<arg value="${dist.appbundle}/Contents/MacOS/JavaApplicationStub" />
</exec>
<copy file="${auxes.dir}/Info.plist" todir="${dist.appbundle}/Contents" />
<copy file="${auxes.dir}/icon.icns" todir="${dist.appbundle}/Contents/Resources" />
<copy file="${dist.dir}/application.jar" todir="${dist.appbundle}/Contents/Resources/Java" />
<copy file="lib/libreria1.jar" todir="${dist.appbundle}/Contents/Resources/Java"/>
</target>
The result is a directory tree viewed ad a application document by OSX.
URL protocol
The application runtime information are stored in info.plist file.
We edited this file inserting a couple of new keys. These keys link out app to the protocol demo://
- URL Types
- URL Identifier
- URL Schemes
Now, the system will launch our utility every time the user clicks on a link starting with demo://

To allow osx to know out utility exist we must :
- copy the app to /Application directory
- or manually launch it at least once
OpenURL
Now we reached our target but we don’t use the clicked url in our code, yet.
To use it, we must relay on a system event osx raises to ask applications to manage urls. We use an extension library provided by Apple, registering a handler to the OpenURI event.
public static void main(final String[] args) {
Application.getApplication().setOpenURIHandler(
new OpenURIHandler() {
@Override
public void openURI(final OpenURIEvent pEvent) {
JOptionPane.showMessageDialog (
null,
pEvent.getURI().toString(),
“demo”,
JOptionPane.ERROR_MESSAGE);
}
});
}
Dependencies
Note that our dependencies jar must be located in Contents/Resources/Java and every jar must be declared in Info.plist under the keys Java/Classpath
Download
You can find a demo project download on our public space in Assembla - link
References
MRJAdapter - java library to enhance osx integration
Apple doc - References to the java info.plist keys
Apple doc - References to application bundles creations
Apple javadoc - Javadoc for Apple Java extensions