¿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
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?
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).
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.
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.
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);
}
...
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". –
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
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.
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
Gracias. Esta linea funciona Cargué el programa y verifico el String con la versión que el programa necesita. – elcool
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.
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.
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).
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.
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.
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);
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)
agrega esa parte del código que obtiene solo la versión de Java. –
String props = System.getProperty ("java.version") – Alex
- 1. cómo verificar la versión de jre usando la aplicación java
- 2. Verificar la versión actual del nodo
- 3. ¿Cómo puedo verificar la versión del sistema de Android?
- 4. Java: encuentre la versión de tzdata en uso, independientemente de la versión de JRE
- 5. Webstart se ejecuta con una versión incorrecta del JRE
- 6. cómo verificar la versión de esfinge?
- 7. Cómo verificar la versión de db2
- 8. Cómo determinar la versión mínima de JRE y los requisitos del sistema para mi aplicación Java
- 9. Eliminar la referencia de NUnit para la versión de lanzamiento
- 10. ¿Cómo verificar snapin antes de agregar?
- 11. Asp.Net Verificar el tamaño del archivo antes de cargar
- 12. Reducción del tamaño de JRE
- 13. Versión de lanzamiento de Android y "Waiting for Debugger"
- 14. ¿Cómo puedo verificar la versión de los módulos de Apache?
- 15. ¿Cómo puedo verificar la versión de una instancia de Liferay?
- 16. Sobrecarga asociada con OutputDebugString en la versión de lanzamiento
- 17. Cómo verificar la versión de Ant en el script Ant
- 18. ¿Cómo verificar la versión de ASP.NET cargada en un sistema?
- 19. Cómo verificar mediante programación la versión/modelo de iPad
- 20. ¿Cómo verificar la versión de iOS es iOS 6?
- 21. Lanzamiento de la nueva versión del sitio web ASP.NET - Mejores prácticas
- 22. ¿Cómo puedo verificar la versión del paquete de nuestra aplicación mediante programación?
- 23. Django: archivos css/js auto minifying antes de la versión
- 24. ¿Qué debo verificar antes de lanzar una aplicación web?
- 25. Versión de proyectos de actualización de rama de Maven automatización del flujo de trabajo de lanzamiento
- 26. Depuración de depuración o lanzamiento del informe?
- 27. Verificar cambios en la base de datos (control de versión)
- 28. Cómo bloquear la versión del complemento maven
- 29. ¿Cómo verificar Delphi la versión del sistema operativo? Windows 7 o Server 2008 R2?
- 30. cómo detecto la orientación del iPhone antes de girar
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
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. –
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)? –