(No estaba seguro de si esto debería continuar en SU ... la migración es ciertamente una opción, pero más programadores leen preguntas aquí, así que aquí va).
Estoy ejecutando Mac OS X 10.8.4 y tengo instalado el JDK 1.6.0_51 de Apple y el JDK 1.7.0_25 de Oracle. Recientemente instalé JDK de vista previa 1.8 de Oracle para algún software de versión preliminar que lo requiere. Ahora, cuando ejecuto / usr / libexec / java_home, obtengo esto:
$ /usr/libexec/java_home -V
Matching Java Virtual Machines (4):
1.8.0, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home
1.7.0_25, x86_64: "Java SE 7" /Library/Java/JavaVirtualMachines/jdk1.7.0_25.jdk/Contents/Home
1.6.0_51-b11-457, x86_64: "Java SE 6" /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
1.6.0_51-b11-457, i386: "Java SE 6" /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
Excelente.
Sin embargo, ejecutando:
$ java -version
Devoluciones:
java version "1.8.0-ea"
Eso significa que la versión predeterminada de Java es actualmente la versión preliminar, que rompe algunos paquetes "normales" (en mi caso, VisualVM).
No puedo configurarlo JAVA_HOME
porque la ejecución de aplicaciones ignora las variables de entorno, incluso cuando se inicia desde la línea de comandos (p $ open /Applications/VisualVM.app
.
Entonces, ¿hay un archivo que pueda editar donde pueda establecer mis preferencias de pedido de JVM globalmente ?
(Por favor, no me diga que inicie el Panel de preferencias de Java porque eso simplemente no funciona: no contiene nada útil y solo enumera una de las 4 JVM que he instalado).
Actualización :
Las JVM de Oracle viven en /Library/Java/JavaVirtualMachines
. jdk1.8.0.jvm.xyz
Cambiar el nombre del directorio JDK 1.8 a no cambia nada: java_home
aún lo encuentra en el lugar correcto, y ejecutar / usr / bin / java aún ejecuta la JVM 1.8. Esto no es un problema con los enlaces sincronizados, etc.
Respuestas a preguntas similares
Si bien esta respuesta ofrece lo que equivale a un truco que eliminará las versiones de Java para que java_home no las recoja, todavía no responde a esta pregunta de cómo java_home elige su valor predeterminado y si los usuarios pueden configurarlo de forma no destructiva .
/usr/bin/java
es solo un enlace simbólico/usr/bin/java
apunta a/System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java
. ElVersions
directorio no contiene un enlace simbólico al 1.8.0 JDK. En su lugar, contiene un directorio llamadoA
queCurrent
apunta a.A
no es un "JAVA_HOME. Tiene un subdirectorio llamadoCommands
que tiene unjava
comando, pero es un binario universal opaco que hace quién sabe qué. Sospecho que usajava_home
, etc. para decidir qué JVM usar.Respuestas:
Creo que
JAVA_HOME
es lo mejor que puedes hacer. A las herramientas de línea de comandos les gustajava
yjavac
respetarán esa variable de entorno, que puede usar/usr/libexec/java_home -v '1.7*'
para darle un valor adecuado para ponerJAVA_HOME
en orden para que las herramientas de línea de comandos usen Java 7.Pero los paquetes de aplicaciones estándar en los que se puede hacer doble clic no usan los JDK instalados debajo
/Library/Java
. Los.app
paquetes de estilo antiguoJavaApplicationStub
que usan Apple usarán Apple Java 6 de/System/Library/Frameworks
, y los de estilo nuevo construidos con AppBundler sin un JRE incluido usarán el JRE "público" en/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home
, que está codificado en el código stub y no se puede cambiar, y no puede tener dos JRE públicos diferentes instalados al mismo tiempo.Editar: Eché un vistazo a VisualVM específicamente, asumiendo que estás usando la versión del "paquete de aplicaciones" de la página de descarga , y esta aplicación en particular no es una aplicación de AppBundler, sino que su ejecutable principal es un script de shell que llama a un número de otros scripts de shell y lee varios archivos de configuración. De forma predeterminada, elige el JDK más nuevo
/Library/Java
siempre que sea 7u10 o posterior, o usa Java 6 si su instalación de Java 7 es la actualización 9 o anterior. Pero al desentrañar la lógica en los scripts de shell, me parece que puede especificar un JDK en particular usando un archivo de configuración.Cree un archivo de texto
~/Library/Application Support/VisualVM/1.3.6/etc/visualvm.conf
(reemplace 1.3.6 con cualquier versión de VisualVM que esté usando) que contenga la líneay esto lo obligará a elegir Java 7 en lugar de 8.
fuente
JAVA_HOME
es el camino a seguir y, en general, tu mejor opción es especificar la versión menor que necesitas en otros casos. Según el desmontaje, resulta que puedeexport JAVA_VERSION=1.7
establecer dejava_home
forma predeterminada que se muestre JKD7 en lugar de JDK8, pero eso se rompejava_home -v 1.6
porque lojava-home
interpreta como una restricción adicional y se da por vencido debido a restricciones mutuamente insatisfactorias, luego simplemente va con el 1.8 predeterminado incluso con la--failfast
opción.También estuve allí y busqué en todas partes cómo
/usr/libexec/java_home
funciona, pero no pude encontrar ninguna información sobre cómo determina las máquinas virtuales Java disponibles que enumera.He experimentado un poco y creo que simplemente ejecuta
ls /Library/Java/JavaVirtualMachines
ay luego inspecciona./<version>/Contents/Info.plist
todos los tiempos de ejecución que encuentra allí.Luego los ordena descendiendo por la tecla
JVMVersion
contenida en Info.plist y, de forma predeterminada, utiliza la primera entrada como su JVM predeterminada.Creo que lo único que podríamos hacer es cambiar el plist:
sudo vi /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Info.plist
y luego modificar JVMVersion de1.8.0
a otra cosa que lo ordene al final en lugar de al superior, como!1.8.0
.Algo como:
y luego desaparece mágicamente de la parte superior de la lista:
Ahora deberá cerrar sesión / iniciar sesión y luego:
:-)
Por supuesto, no tengo idea si algo más se rompe ahora o si la versión 1.8.0-ea de java todavía funciona correctamente.
Probablemente no debería hacer nada de esto, sino simplemente desinstalar 1.8.0.
Sin embargo, hasta ahora esto me ha funcionado.
fuente
/usr/libexec/java_home -v 1.7
. Creo que haré lo mismo con JAVA_HOME .../usr/bin/java
encontrará el JDK más reciente instalado y lo usará para todas las herramientas de línea de comandos relacionadas con Java en/usr/bin
.De hecho, es bastante fácil. Digamos que tenemos esto en nuestra carpeta JavaVirtualMachines:
Imagine que 1.8 es nuestro predeterminado, luego simplemente agregamos una nueva carpeta (por ejemplo, 'antigua') y movemos la carpeta jdk predeterminada a esa nueva carpeta. ¡Hazlo de
java -version
nuevo y listo, 1.7!fuente
Es bastante simple, si no le importa arremangarse ... / Library / Java / Home es el predeterminado para JAVA_HOME, y es solo un enlace que apunta a uno de:
Así que quería cambiar mi versión predeterminada de JVM / JDK sin cambiar el contenido de JAVA_HOME ... / Library / Java / Home es la ubicación estándar para la JVM / JDK actual y eso es lo que quería preservar ... me parece para ser la forma más fácil de cambiar las cosas con los menores efectos secundarios.
De hecho, es muy simple. Para cambiar qué versión de java ve con java -version, todo lo que tiene que hacer es alguna versión de esto:
No me he tomado el tiempo, pero un script de shell muy simple que hace uso de / usr / libexec / java_home y ln para volver a señalar el enlace simbólico anterior debería ser estúpidamente fácil de crear ...
Una vez que haya cambiado dónde apunta / Library / Java / Home ... obtendrá el resultado correcto:
fuente
/Library/Java/Home
hecho es un enlace simbólico, pero apunta a/System/Library/Frameworks/JavaVM.framework/Home
que en sí mismo está en una gran confusión de enlaces simbólicos que finalmente te lleva a ... un comando mágico que determina el JRE correcto para iniciar. Tenga en cuenta que/usr/libexec/java_home
también se vincula con esta magia. Por lo tanto, puede interrumpir todo simplemente reemplazando los enlaces simbólicos y apuntando a un solo JRE, pero tendrá que actualizarlo cada vez. Evidentemente no hay un comando comoset_preferred_jvm_version
o algo similar.JAVA_HOME
ningún lugar. Jugaré con esta técnica para ver si da como resultado programas basados en Java que se ejecutan con la máquina virtual Java "preferida". Sospecho que lo hará, pero es bastante frágil..bash_profile
:export JAVA_HOME=`/usr/libexec/java_home -v 12`
Instrucciones de desinstalación de Oracle para Java 7 funcionaron para mí.
Extracto:
fuente
Un poco tarde, pero como este es un problema continuo con Mac OSX ...
La solución más simple que encontré fue simplemente eliminar las cosas de OpenJDK que instala Apple. Cada vez que llega una actualización de Mac OSX, se instala y deberá eliminarla nuevamente.
Esto funciona muy bien si desarrolla aplicaciones para Google App Engine en su mac usando Java. OpenJDK no funciona bien y la versión de Java que viene con la actualización de Mac OSX Yosemite hará que el complemento de Eclipse para App Engine se bloquee en cada implementación con el útil error: "Tiempo de lectura agotado".
fuente
Probé "jenv" y otras cosas como configurar "JAVA_HOME" sin éxito. Ahora yo y terminé con la siguiente solución
(agregado a ~ / .bashrc o ~ / .bash.profile o ~ / .zshrc)
Y llamando así:
java_home manejará la entrada incorrecta. para que no puedas hacer algo mal. Maven y otras cosas recogerán la versión correcta ahora.
fuente
De hecho, miré esto un poco en el desensamblador, ya que la fuente no está disponible.
/ usr / bin / java y / usr / libexec / java_home utilizan JavaLaunching.framework. De hecho, la variable de entorno JAVA_HOME es verificada primero por / usr / bin / java y amigos (pero no por / usr / libexec / java_home). El marco usa las variables de entorno JAVA_VERSION y JAVA_ARCH para filtrar las JVM disponibles. Entonces, por defecto:
Pero configurar, digamos, JAVA_VERSION puede anular el valor predeterminado:
También puede configurar JAVA_LAUNCHER_VERBOSE = 1 para ver algunos registros de depuración adicionales en cuanto a rutas de búsqueda, JVM encontradas, etc., con / usr / bin / java y / usr / libexec / java_home.
En el pasado, JavaLaunching.framework en realidad usaba el sistema de preferencias (bajo el dominio com.apple.java.JavaPreferences) para establecer el orden de JVM preferido, permitiendo que la JVM predeterminada se estableciera con PlistBuddy , pero lo mejor que puedo decir es que El código se ha eliminado en versiones recientes de macOS. Las variables de entorno parecen ser la única forma (además de editar Info.plist en los propios paquetes de JDK).
Por supuesto, la configuración de las variables de entorno predeterminadas se puede realizar a través de su .profile o mediante launchd , si necesita que se establezcan a nivel de sesión.
fuente
.profile
no es útil para mi caso de uso (lanzar una aplicación desde, por ejemplo, Launchpad) pero el consejolaunchd
es bueno. Tendré que intentarlo, ya que la locura de las versiones recientes de Java significa que tengo varias generaciones de Java instaladas simultáneamente, con diferentes niveles de confianza (personal).Editar: esta información es para visualvm específicamente, no para ninguna otra aplicación de Java
Como han mencionado otros, debe modificar visualvm.conf
Para la última versión de JvisualVM 1.3.6 en Mac, los directorios de instalación han cambiado.
Actualmente se encuentra en /Applications/VisualVM.app/Contents/Resources/visualvm/etc/visualvm.conf .
Sin embargo, esto puede depender de dónde haya instalado VisualVM. La forma más fácil de encontrar dónde su VisualVM es iniciarlo y luego mirar el proceso usando:
ps -ef | grep VisualVM
Verás algo como:
... -Dnetbeans.dirs = / Aplicaciones / VisualVM.app / Contenidos / Recursos / visualvm / visualvm ...
Desea tomar la propiedad netbeans.dir y buscar un directorio y encontrará la carpeta etc.
Descomente esta línea en visualvm.conf y cambie la ruta al jdk
Además, si tiene lentitud con su visualvm y tiene mucha memoria, sugeriría que aumente en gran medida la cantidad de memoria disponible y la ejecute en modo servidor:
fuente
~/Library/Application Support/VisualVM/1.3.6/etc/visualvm.conf
.Tuve una situación similar y el siguiente proceso funcionó para mí:
En la terminal, escriba
Luego agregue esta línea en el archivo y guarde
donde la versión es la de su computadora, como 1.7.0_25
Salga del editor, luego escriba el siguiente comando para que sea efectivo
Luego escriba java -version para verificar el resultado
¿Qué es .profile? De: http://computers.tutsplus.com/tutorials/speed-up-your-terminal-workflow-with-command-aliases-and-profile--mac-30515
fuente
MacOS usa / usr / libexec / java_home para encontrar la versión actual de Java. Una forma de evitarlo es cambiar el archivo plist como se explica en @ void256 arriba. Otras formas es tomar la copia de seguridad de java_home y reemplazarla con su propio script java_home que tiene el código
echo $ JAVA_HOME
Ahora exporte JAVA_HOME a la versión deseada del SDK agregando los siguientes comandos a ~ / .bash_profile. export JAVA_HOME = "/ System / Library / Java / JavaVirtualMachines / 1.6.0.jdk / Contents / Home" launchctl setenv JAVA_HOME $ JAVA_HOME /// Convertir la variable de entorno en global
Ejecute el comando source ~ / .bash_profile para ejecutar los comandos anteriores.
Siempre que uno necesite cambiar JAVA_HOME, puede restablecer el valor de JAVA_HOME en el archivo ~ / .bash_profile.
fuente
Quería cambiar la versión de Java predeterminada de 1.6 * a 1.7 *. Probé los siguientes pasos y funcionó para mí:
ln -s /Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/bin/java java
versión de java "1.7.0_51"
Java (TM) SE Runtime Environment (compilación 1.7.0_51-b13)
Java HotSpot (TM) 64-Bit Server VM (compilación 24.51-b03, modo mixto)
fuente
/usr/libexec/java_home
.