2009-02-18 20 views
27

Siempre me he preguntado por qué tengo que configurar manualmente la variable de entorno JAVA_HOME después de instalar Java SDK.¿Por qué el instalador de Java SDK no establece JAVA_HOME?

JAVA_HOME = c: \ Archivos de programa \ Java \ jdk1.6.0_12

Visual Studio proporciona al menos un archivo por lotes para establecer este tipo de variables de entorno:

llamada " c: \ archivos de programa \ Microsoft Visual Studio 9.0 \ VC \ vcvarsall.bat"

¿El Java tienen algo similar? Intento crear un script de compilación que simplemente funcione después de instalar Java SDK. No quiero que la gente juegue con variables de entorno en su PC.

+1

Porque Java no lo necesita. – EJP

Respuesta

33

Puede instalar tantas versiones de Java como desee.

que sería peligroso para la configuración para modificar una variable local de entorno como JAVA_HOME, ya que podría hacer referencia a una instalación existente de Java.

Esto no tiene nada que ver con un supuesto "problema dependiente de la plataforma". ;)

Desde guiones pueden depender de JAVA_HOME para lanzarse, una vez más, esto sería desastroso para una nueva instalación de Java para modificar JAVA_HOME: todos esos guiones de repente tiene que ser puesto en marcha con una nueva JVM potencialmente incompatibles.

Además, mediante el establecimiento de $JAVA_HOME/bin o %JAVA_HOME%/bin en su camino, se puede cambiar dinámicamente JAVA_HOME a cualquier versión de Java que desea utilizar sin tener que gran parte de la variable PATH.


Michael Borgwardt ha hecho en los comentarios a la pregunta del seguimiento interesante

Sin embargo, esto no explica por qué el instalador no se establece JAVA_HOME cuando no se establece previamente en absoluto.

La respuesta es sencilla:

La configuración no se puede saber si un guión ya depende de JAVA_HOME o no.

Significado: algunos scripts podrían probar el valor JAVA_HOME, y si no están configurados, consulte otra JVM instalada en otro lugar (y no olvide que por "instalar", solo se puede hacer referencia a "copiado": JDK/JRE es no siempre instalado por una configuración)

Si configura JAVA_HOME, eso puede interrumpir el comportamiento predeterminado de algunos de sus scripts.

No queriendo molestar a los guiones hipotéticos que dependen de un env var no está establecido sonido sin sentido paranoico para mí - Si un script hace eso, entonces claramente quiere utilizar una JVM diferente cuando uno instalado - no hay razón para evitar eso.

Mmm ... dulce. Para tratar con el despliegue masivo cuestiones en un diario-base (para su aplicación interna en mi tienda), les puedo asegurar que: es muy sano "paranoica" delicia tener.
Al implementar en un grupo (muy) grande de usuarios, no desea hacer ninguna suposición sobre su plataforma y configuraciones. "claramente QUIERE" es una suposición que no me atrevería a hacer (o redirijo mi teléfono a la tuya;) y usted maneja las llamadas enojadas).

Por ejemplo, tenemos muchas secuencias de comandos que se inician con una JVM 1.4.2 desde sol (JAVA_HOME no establecido en la plataforma de desarrollo, ruta predeterminada establecida directamente en la secuencia de comandos) o con 1.4.2 desde JRockit (JAVA_HOME conjunto, como es el objetivo previsto en las plataformas de integración, preproducción y producción).

Pero instalamos regularmente el nuevo JDK1.6.x ya que utilizamos para el lanzamiento de Eclipse.

Supongamos que esos guiones quieren que su conjunto JAVA_HOME ... y nada funciona más.

... A lo que hace que este Robert Grant crítico sobre el terreno:

Estás describiendo las secuencias de comandos que requieren una versión específica, pero todavía miran JAVA_HOME global. Eso es solo guiones mal pensados.

Mientras que puede o no puede ser cierto, que también ilustra precisamente mi punto:
"que no quieren hacer ninguna suposición": ninguna suposición sobre su plataforma/ajustes, y ninguna suposición sobre su "mejores prácticas".
El primero puede sonar paranoico, este último es llano sentido común: pensar que su producto (en este caso una instalación de JDK) no va a romper nada en el entorno del usuario porque el usuario tiene "correctamente" pensado sus guiones ... sería insano.


GvS sugiere:

o simplemente podría tener la opción de hacerlo, desactivado por defecto

Eso significaría otra opción para incluir en las pantallas de configuración, opción que debería ser cuidadosamente revisado por el usuario, y que puede tener consecuencias no deseadas, incluso cuando el usuario lo selecciona pensando que sabe lo que está haciendo ...

Simplemente no vale la pena.

+1

Aún así, esto no explica por qué el instalador no establece JAVA_HOME cuando no está configurado previamente. –

+0

O simplemente podría tener la opción de hacerlo, deshabilitada de forma predeterminada. – GvS

+0

No quiero molestar a las secuencias de comandos hipotéticas que dependen de un env var que no se establezca sonido paranoico sin sentido para mí: si una secuencia de comandos hace eso, entonces claramente QUIERE usar una JVM diferente cuando hay una instalada, no hay razón para evitar eso. –

-1

Supongo que Java no quiere hacer nada que dependa de la plataforma. En Windows, los classpaths se configuran de forma diferente a LINUX/UNIX.

+2

Bueno, en Windows ofrece la instalación por defecto en "C: \ Archivos de Porgrama". Estoy bastante seguro de que no hace eso en * nix. El punto es que ya depende de la plataforma. –

0

No estoy seguro de por qué esto es así, porque los instaladores resuelven claramente problemas dependientes de la plataforma (que es, por supuesto, el objetivo de una JVM). ¿Estás seguro de que no estás mezclando el JRE con el JSDK?

Quizás haya una forma de que su programa busque dónde está instalado java (eso sería un script, supongo), y luego configure JAVA_HOME y posiblemente lo agregue a la ruta.

IBM parece estar haciendo este truco ya: http://www-01.ibm.com/support/docview.wss?rs=180&uid=swg21199220

Otro interesante puesto insinuando la diferencia entre JRE e instalaciones JSDK: http://confluence.atlassian.com/display/CONF26/Set+JAVA_HOME+variable+in+Windows

Espero que esto ayude.

+0

El enlace de IBM está muerto – Antimony

10

No creo que JAVA_HOME sea una convención inventada o respaldada por Sun.

Probablemente recuerden el fiasco que era la variable de entorno CLASSPATH ** demasiado bien y prefieren mantenerse al margen de las variables de entorno. ** Esto se fomentó como la forma principal de establecer el classpath JVM en SDK y literatura anteriores de Java, y ocasionó que el usuario y varias aplicaciones se metieran con la variable de entorno, sobrescribiendo los cambios entre sí y dependiendo de los contenidos mutuamente contradictorios.

+2

Buena referencia histórica. +1 – VonC

3

El mecanismo vcvarsall.bat es una forma conveniente para que Visual C++ proporcione una consola con las variables correctas sin interferir con las variables de entorno del usuario/sistema. Sin embargo, asume que Installshield es la única forma de obtener código en el sistema. El JDK debe tolerar que se corte de un lugar a otro.

Si usted está buscando java.exe, el instalador debe Installshield puso en % windir% \ system32, por lo que está disponible en el camino.

Usted puede obtener algunas pistas sobre la ubicación de las aplicaciones instaladas mediante la consulta del registro:

C:>REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit\1.6" /v JavaHome 

! REG.EXE VERSION 3.0 

HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit\1.6 
    JavaHome REG_SZ C:\dev\Java\jdk1.6.0_05 

Sin embargo, no se puede confiar en esta absolutamente porque esto hace que algunas suposiciones acerca de proveedor, la versión y el mecanismo de instalación.

0

Esto puede ayudar a alguien más que termina aquí como yo. Solo quería usar Java como herramienta, no adoptarla como una forma de vida, así que solo necesitaba saber cómo se estaba estableciendo JAVA_HOME y por qué no era correcta. La respuesta resultó ser que la instalación de WinAnt establece JAVA_HOME (junto con ANT_HOME), pero solo se basa en la Java instalada actualmente. Entonces, si necesita cambiar la versión de Java y está usando Ant, la forma correcta de hacerlo es desinstalar WinAnt, desinstalar Java, instalar el nuevo Java y luego reinstalar WinAnt.

Cuestiones relacionadas