macOS, Java et les applications

Comme j’ai eu le problème et que le post de Guillaume m’a bien aidé, petit sujet sur Java.

Petite résumé : pendant des années, Apple a fourni une machine virtuelle avec Mac OS X. Mais la société a abandonné cette dernière il y a un moment maintenant, avec El Capitan (10.11). La mise à jour fonctionne avec quelques versions plus récentes de l’OS (officiellement High Sierra, 10.13, en pratique Mojave, 10.14) mais c’est une vieille version (Java 6) avec des failles de sécurité.

La solution officielle, c’est de passer par une distribution Java. Il y a du choix : Azul, Adoptium (Temurin), Amazon Corretto, Microsoft, etc. Mais dans certains cas, même après avoir installé la bonne version de Java, ça ne fonctionne pas. C’est le cas avec les anciennes versions des applications Adobe, par exemple.

La raison est un peu technique, mais en gros, la machine virtuelle d’Apple prend en charge JNI et les applications Java, alors que les autres se limitent à l’équivalent d’un plug-in pour le navigateur. Certaines distributions ajoutent le nécessaire dans les fichiers, mais ce n’est pas sytématique, donc il faut parfois y aller à la mano.

Il faut donc aller modifier le fichier /Library/Java/JavaVirtualMachines/votre_java.jdk/Contents/Info.plist (en remplaçant votre_java par celui installé). Attention, vous aurez besoin d’un éditeur de texte qui permet d’utiliser les droits administrateurs (ou sinon, utiliser la commande sudo nano).

Dans le fichier, il faut chercher le bloc
<key>JVMCapabilities</key>
<array>
<string>CommandLine</string>
</array>

Et ajouter deux lignes, pour obtenir ceci.
<key>JVMCapabilities</key>
<array>
<string>CommandLine</string>
<string>JNI</string>
<string>BundledApp</string>
</array>

Dans certains cas, les lignes sont déjà présentes (comme avec Temurin 17 sur un Mac récent) mais si vous devez installer Java 7 ou 8 sur un vieux Mac OS X, ce n’est probablement pas le cas. Normalement, le simple fait d’ajouter les lignes devrait permettre de lancer les applications Java. Le problème arrive notamment avec Rational Application Developer, ou avec Eclipse (par exemple).