2008-10-21 15 views
11

¿Cuál es la mejor manera de determinar si la versión de JRE instalada en una máquina es lo suficientemente alta para la aplicación que el usuario desea ejecutar? ¿Hay alguna manera de hacerlo utilizando cosas solo de Java? Me gustaría que la solución funcione en Windows/Linux/MacOSX: si la versión de JRE es demasiado baja, debería mostrarse un mensaje. Actualmente recibo una excepción si intento ejecutarlo en Java 1.5 (la aplicación está desarrollada para Java 1.6). Si no hay una solución universal, ¿cuál es la mejor manera de hacerlo en Windows?¿Cómo verificar la versión de JRE antes del lanzamiento?

Respuesta

1

Una aplicación creada para una versión superior de JRE no se ejecutará en una versión inferior de JRE. Por lo tanto, no podría agregar código a su aplicación para verificar la versión de JRE. Si la versión de JRE no es compatible, el código de comprobación de versión de JRE no se ejecutará en primer lugar.

Lo que tendrías que hacer es tener algún tipo de aplicación iniciadora creada para una versión inferior de JRE (1.3?) Que verifica la versión y luego inicia tu aplicación si es necesario. Esto suena un poco kludgy para mí.

¿Qué hay de comprobar la versión durante la instalación? ¿Está instalando la aplicación de una manera que le permite verificar las variables de entorno o realizar algún tipo de secuencia de comandos?

+0

Esto no es necesariamente cierto. En la mayoría de los casos, funcionará bien. Solo si usa un lenguaje más reciente o funciones de API, surgirán problemas. – fiddlesticks

+0

No es cierto. Si compilo una aplicación Hello World simple con JDK 1.6 e intento ejecutarla con JDK 1.4, obtengo un UnsupportedClassVersionError. Lo que está diciendo solo funcionaría si compilé con 1.6 pero especifiqué -objetivo 1.4. –

+0

Aún así, lo que le impide compilar la clase principal con 1.3, hacer todos los controles en él, y luego llamar al resto de la aplicación (1.6, por ejemplo)? –

2

En general, nos hemos acercado a esto con un envoltorio de shell C o (cuando solo se usa unix). No estoy seguro de que esto realmente funcione para usted.

También nos acercamos a esto incorporando el JRE en nuestro producto. Se ocupa del 99.9% de los casos (el otro 0.1% del tiempo es un usuario que cambia explícitamente nuestra configuración para usar una JVM diferente). De nuevo, no estoy seguro de que esta sea una solución razonable para usted.

En nuestro caso, hay cantidades significativas de código nativo (JNI y de otro tipo), por lo que es necesario adaptar una imagen instalable para cada plataforma que admitimos. Pero si se trata de una solución puramente Java, puede que simplemente tenga que documentar su mínimo y decirle a la gente que se ponga en contacto con el programa (sin juego de palabras) si es que van a ejecutar sus cosas. Es como que la gente se queja de que mi Mac no ejecutará MSVC, o que mi caja de Linux está teniendo problemas para ejecutar World of Warcraft. Esa no es la máquina (virtual) para la cual el software está dirigido, usted necesita cambiar. Al menos en el mundo de Java, sin embargo, podemos llamar a esto una mejora, sin dañar los sentimientos religiosos de nadie. (Intente indicarle al usuario de Mac "actualizar" a Windows XP para ejecutar MSVC; hay una interrupción esperando que ocurra).

0

System.getProperties() le ofrece una lista de las propiedades de JVM, incluidos los ID de las diferentes versiones del JRE, JVM y especificación. Esto se implementó para todas las versiones de Java, por lo que debería funcionar independientemente de la versión compilada y la ejecución de la versión, o la implementación.

Si escribe una clase básica para probar la versión, puede llamarla primero en su clase de inicio main(). Sin embargo, realmente debe ser una funcionalidad básica o podría arriesgarse a romperla.

5

También podría considerar el uso de Commons-Launcher, que le permite configurar varios ajustes de entorno o realizar comprobaciones previas antes de llamar a su aplicación.

http://commons.apache.org/launcher

1

Para el lanzador - comprobar la versión en ese país.

Dentro de la APLICACIÓN; como arriba use System.getProperties();

Properties sProp = java.lang.System.getProperties(); 
String sVersion = sProp.getProperty("java.version"); 
sVersion = sVersion.substring(0, 3); 
Float f = Float.valueOf(sVersion); 
if (f.floatValue() < (float) 1.4) { 
    System.out.println("Java version too low ...."); 
    System.exit(1); 
} 
... 
+0

Esto es MUY IFFY. Si no es esa versión EXACTA, o no la instalaron en esa ubicación, o no está ejecutando Windows, fallará. Una modificación que PODRÍA funcionar es conectar la salida de java -v a algo y analizar eso, pero aún será difícil encontrar una versión "o posterior". –

+0

Y mire lo que pidió - plataformas linux/win/mac o al menos ventanas. La mayoría de las cosas corporativas se instalan en la "ubicación exacta". linux y mac hacen lo mismo. – jim

11

Puede hacer esto utilizando la reflexión y dos compiladores. Compila una clase principal con la versión más antigua de Java con la que quieras ejecutar.Comprueba la versión usando System.getProperty("java.version"), o lo que sea, y luego usa la reflexión para cargar su clase principal real si pasa esa verificación, posiblemente incluso cargando el contenedor directamente. El JRE no debería cargar ninguna clase a la que su clase principal externa no hizo referencia en el momento de la compilación.

+2

No necesita necesariamente dos compiladores. El compilador Java admite una opción -target, que le permite especificar la versión Bytecode de los archivos de clase producidos. – Mnementh

+0

Gracias. Esta linea funciona Cargué el programa y verifico el String con la versión que el programa necesita. – elcool

0

Hmm ... llámame un tipo aburrido, pero qué hay de malo con el uso de Launch4J o cualquier otro iniciador nativo, por ejemplo.

Utilice un iniciador nativo para verificar la versión de JVM antes de ejecutar su código. Las soluciones solo de Java (en mi libro) solo tienen sentido cuando tratas con desarrolladores; una vez que llegue a los usuarios finales, se dará cuenta de que no se preocupan por Java ni por sus detalles técnicos. Si hubiera escrito su solicitud en GW-Basic no les importaría menos, siempre y cuando su aplicación funcione.

Si Java 1.6 no está instalado, lauchner4j apuntará al usuario a la página de descarga de JDK 1.6. Eso es probablemente más adecuado para su problema que hacer magia en Java.

9

Usted podría considerar Java Webstart. Incluso si el nombre implica algo así como applets, se trata de aplicaciones independientes. Webstart es un iniciador, que comprueba un archivo JNLP (un archivo XML simple, donde configura la ubicación de descarga de su aplicación, la versión Java necesaria y algunos otros metadatos) e inicia su aplicación con el JRE correcto. Incluso actualiza la aplicación, si hay una versión más nueva disponible. La desventaja es que tienes que escribir un archivo JNLP. Aquí hay un ejemplo:

<?xml version="1.0" encoding="utf-8"?> 

<!-- 
############################################################################### 
# 
# @(#)draw.jnlp 1.6 02/09/11 
# 
# JNLP File for Draw Demo Application 
# 
############################################################################### 
--> 


<jnlp spec="0.2 1.0" 
     codebase="http://java.sun.com/javase/technologies/desktop/javawebstart/apps" 
     href="draw.jnlp"> 
    <information> 
     <title>Draw 4 App</title> 
     <vendor>Sun Microsystems, Inc.</vendor> 
     <homepage href="http://java.sun.com/javase/technologies/desktop/javawebstart/demos.html"/> 
     <description>A minimalist drawing application along the lines of Illustrator</description> 
     <description kind="short">Draw Demo Short Description</description> 
     <icon href="images/draw.jpg"/> 
     <offline-allowed/> 
    </information> 
    <resources> 
     <j2se version="1.3+" href="http://java.sun.com/products/autodl/j2se"/> 
     <j2se version="1.3+"/> 
     <jar href="draw.jar" main="true" download="eager"/> 
    </resources> 
    <application-desc main-class="Draw"/> 
</jnlp> 

Una segunda posibilidad es utilizar un programa iniciador. Un ejemplo es el Apache Commons Launcher. También puede escribir alguna aplicación de iniciador usted mismo, pero generalmente no vale la pena el esfuerzo.

0

Encuentro que WinRun4J funciona bastante bien para mí (pero, de nuevo, puedo estar predispuesto desde que lo escribí :-)). Esto le permite especificar una versión mínima y/o máxima de java permitida. Aparecerá un cuadro de mensaje para el usuario si no se encuentra una versión JRE adecuada (y el mensaje es personalizable).

2

Puede requerir una versión de Java cuando ejecuta el comando de Java, p. java -version:1.6* com.me.MyClass. No estoy seguro de si esto funciona en todas las versiones de Java, pero funciona bien en 1.6 de todos modos.

1

Tiene una clase de lanzamiento compilada para Java 1.2 que invoca la real principal() en sus clases 1.6. Si se produce una excepción de clase no admitida, tómala y muestra un bonito mensaje de error.

1

Aquí está el código para instalar la versión de JRE en un sistema.

var list = deployJava.getJREs(); 
var result = ""; 
result = list[0]; 
for (var i=1; i<list.length; i++) 
{ 
    result += ", " + list[i]; 
} 
document.write("jre version : "+result); 
0

Todo lo anterior es demasiado complicado. Sólo ve :

Properties props = System.getProperties() 
props.list(System.out) 

y verá todo lo relacionado con la JVM, JRE, JDK y el personal. O obtenga un valor específico usando:

//full list of possible props you can see if u run code above 
String props = System.getProperty(prop) 
+0

agrega esa parte del código que obtiene solo la versión de Java. –

+0

String props = System.getProperty ("java.version") – Alex

Cuestiones relacionadas