12 votes

Comment fonctionne /usr/bin/java sur Mac ?

J'ai trouvé /usr/bin/java lié à /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java . Et le contenu de son fichier est différent de /Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/bin/java . Mais lorsque je tape /usr/bin/java -version il imprime

java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode) 

Je m'interroge donc sur l'implémentation de /usr/bin/java et je me demande pourquoi il peut toujours pointer vers la dernière version de mes JavaVirtualMachines ?

17voto

Je ne peux pas répondre entièrement à votre question, mais je peux vous donner quelques indications pratiques.

TL:DR ;

Je pense que /usr/bin/java est une application proxy, faisant partie de MacOS, qui appelle la fonction java dans l'installation courante de Java telle que définie par la commande JAVA_HOME env var.

Il en va de même pour toutes les commandes liées à java dans la rubrique /usr/bin

Plus de détails

J'ai installé (manuellement, en dézippant les openjdks dans /Library/Java/JavaVirtualMachines/ ) de nombreuses versions de Java, et il suffit de définir un JAVA_HOME différent pour que la version change :

$ JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home && java -version
java version "1.8.0_112"
Java(TM) SE Runtime Environment (build 1.8.0_112-b16)
Java HotSpot(TM) 64-Bit Server VM (build 25.112-b16, mixed mode)

$ JAVA_HOME=/Library/Java/JavaVirtualMachines/amazon-corretto-11.jdk/Contents/Home/ && java -version
openjdk version "11.0.11" 2021-04-20 LTS
OpenJDK Runtime Environment Corretto-11.0.11.9.1 (build 11.0.11+9-LTS)
OpenJDK 64-Bit Server VM Corretto-11.0.11.9.1 (build 11.0.11+9-LTS, mixed mode)

$ JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-16.0.1.jdk/Contents/Home/ && java -version
openjdk version "16.0.1" 2021-04-20
OpenJDK Runtime Environment (build 16.0.1+9-24)
OpenJDK 64-Bit Server VM (build 16.0.1+9-24, mixed mode, sharing)

Toutes les commandes Java dans /usr/bin ont la même taille (136Kb dans mon cas) :

$ ll -h /usr/bin/ja*
-rwxr-xr-x  1 root  wheel   136K Jan  1  2020 /usr/bin/jar
-rwxr-xr-x  1 root  wheel   136K Jan  1  2020 /usr/bin/jarsigner
-rwxr-xr-x  1 root  wheel   136K Jan  1  2020 /usr/bin/java
-rwxr-xr-x  1 root  wheel   136K Jan  1  2020 /usr/bin/javac
-rwxr-xr-x  1 root  wheel   136K Jan  1  2020 /usr/bin/javadoc
-rwxr-xr-x  1 root  wheel   136K Jan  1  2020 /usr/bin/javah
-rwxr-xr-x  1 root  wheel   136K Jan  1  2020 /usr/bin/javap
-rwxr-xr-x  1 root  wheel   136K Jan  1  2020 /usr/bin/javapackager
-rwxr-xr-x  1 root  wheel   136K Jan  1  2020 /usr/bin/javaws

En fait, de nombreux fichiers dans /usr/bin sont les mêmes :

$ find /usr/bin | sort | xargs md5 | grep d50afbfa4f5d05e8db7ad88c30390888
MD5 (/usr/bin/appletviewer) = d50afbfa4f5d05e8db7ad88c30390888
MD5 (/usr/bin/apt) = d50afbfa4f5d05e8db7ad88c30390888
MD5 (/usr/bin/extcheck) = d50afbfa4f5d05e8db7ad88c30390888
MD5 (/usr/bin/idlj) = d50afbfa4f5d05e8db7ad88c30390888
MD5 (/usr/bin/jar) = d50afbfa4f5d05e8db7ad88c30390888
MD5 (/usr/bin/jarsigner) = d50afbfa4f5d05e8db7ad88c30390888
MD5 (/usr/bin/java) = d50afbfa4f5d05e8db7ad88c30390888
MD5 (/usr/bin/javac) = d50afbfa4f5d05e8db7ad88c30390888
MD5 (/usr/bin/javadoc) = d50afbfa4f5d05e8db7ad88c30390888
MD5 (/usr/bin/javah) = d50afbfa4f5d05e8db7ad88c30390888
.
.
.

Dans "System Information.app > Software > Installation", je ne trouve pas d'installation spécifique. Jan 1 2020 Je vois que j'ai installé Catalina le 2019-10-12 et Big Sur le 2020-12-04 (tous les fichiers dans /usr/bin avoir une date Jan 1 2020 ).

En outre pkgutil ne m'indique pas à quelle installation de paquetage l'option /usr/bin/java appartient aux commandes :

$ pkgutil --file-info /usr/bin/java
volume: /
path: /usr/bin/java

Je pense qu'il fait partie de MacOS et qu'il a été installé (ou mis à jour) par Big Sur.

Faites-moi savoir si j'ai oublié quelque chose ou si j'ai plus d'informations pour une image plus claire :-)

9voto

James Lin Points 11

La réponse la plus complète que j'ai trouvée est celle de Stack Overflow :

https://stackoverflow.com/questions/21964709/how-to-set-or-change-the-default-java-jdk-version-on-MacOS/44169445#44169445

En résumé, /usr/bin/java trouve toutes les JVM sous /Library/Java/JavaVirtualMachines y ~/Library/Java/JavaVirtualMachines et pointe vers la dernière JVM qui a Contents/Info.plist . Si vous renommez ce fichier dans une JVM en, disons, Contents/Info.plist.disabled alors /usr/bin/java ne le choisira pas.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X