Cet article décrit comment encapsuler un .jar exécutable dans un bundle macOS (une application native macOS, donc un répertoire .app possédant une certaine structure).
Tout d'abord, il vous faut le programme appbundler disponible (par exemple) chez Bitbucket. C'est lui qui crée l'application native.
Voici la version disponible au moment de l'écriture de cet article: infinitekind-appbundler-6687ec9d200c.zip
Décompressez, vous obtenez alors un répertoire contenant un fichier build.xml
et un sous-répertoire appbundler
, lancez un Terminal
et placez-vous dans le répertoire contenant build.xml
.
Il suffit alors de lancer ant
.
Chez moi, il est ici: /Applications/NetBeans/NetBeans 8.1.app/Contents/Resources/NetBeans/extide/ant/bin/ant
.
Xcode
afin de compiler JavaAppLauncher
ou alors prenez directement mon fichier appbundler-1.0ea.jar.zip
disponible ci-dessous.
Cela crée le programme appbundler-1.0ea.jar
dans le répertoire appbundler/bin
. Voici le mien: appbundler-1.0ea.jar.zip, il est modifié afin de n'avoir que la version 64 bits de JavaAppLauncher
.
Voyons comment faire à l'aide d'un exemple, l'article de Verbiste contient verbiste-gui.jar.zip.
Placez verbiste-gui.jar, appbundler-1.0ea.jar et verbiste.icns.zip (décompressé) dans un même répertoire.
Toujours dans ce répertoire, créez le fichier build.xml
comme suit:
<?xml version="1.0" encoding="UTF-8"?> <project name="Verbiste" default="Verbiste" basedir="."> <!-- Import environment variables --> <property environment="env"/> <!-- Define the appbundler task --> <taskdef name="appbundler" classname="com.oracle.appbundler.AppBundlerTask" classpath="appbundler-1.0ea.jar" /> <!-- Create the app bundle --> <target name="Verbiste"> <appbundler outputdirectory="." name="Verbiste" displayname="Verbiste" identifier="granddub.verbiste.Verbiste" shortversion="1.0" mainclassname="verbiste.Verbiste" icon="verbiste.icns" copyright="© 2017 Grand Dub Merci à: Pierre Sarrazin <http://sarrazip.com/dev/verbiste.html>" > <classpath file="VerbisteUI.jar"/> <option value="-Dapple.laf.useScreenMenuBar=true"/> <!-- Pour avoir le même PATH dans l'appli que le shell courant (qui lui sait lancer french-conjugator) --> <environment name="PATH" value="${env.PATH}" /> <scheme value="mailto"/> </appbundler> </target> </project>
Lancez ant
, c'est terminé.
La documentation Oracle citée ci-dessus explique aussi comment encapsuler le JRE
dans le bundle afin de le distribuer indépendamment de l'installation de Java sur la cible.