SoloCodigo
Programación General => Java => Mensaje iniciado por: paulados en Jueves 12 de Marzo de 2009, 01:43
-
Hola a todos,
Comento el error que me surgio, y la duda de ese error. Estaba compilando un jar con la version de java 1.6. Al irme a casa, lo ejecuto muy feliz, y me da un error (pense que habría puesto mal el classpath o algo, tambien es cierto que lei el mensaje de error por encima). El caso es que intentaba ejecutar el jar compilado con 1.6 con la maquina 1.5, y se quejaba de eso, pero con un mensaje "parecido" al tipico de cuando no esta bien la ruta.
Lo que quiero hacer, es dentro del código java, si intento ejecuarlo con una máquina de version anterior, que saque un mensaje en "cristiano" que diga: Este programa requiere java 1.6, y no esta instalado, y no de un horrible mensaje de error como el que da. Existe alguna forma de detectar eso en codigo java? Desde ya yo mismo imagino que no, pero bueno, por si existiese, agradeceria si alguien lo sabe :-D
Ciaoo y gracias por adelantadoo!!!!
-
Con System.getProperties("java.version")
http://java.sun.com/j2se/1.5.0/docs/api ... roperties( (http://java.sun.com/j2se/1.5.0/docs/api/java/lang/System.html#getProperties(" onclick="window.open(this.href);return false;))
-
Hola,
Perdon por no dar muchos datos concretos en el correo anterior. Era tarde y no podía pensar mucho :-P
Primero, muchas gracias por responder tan rápido. Con lo que me has dicho se puede comprobar la versión de java. He probado creando este simple código:
public class testVersion
{
public static void main(String args[])
{
try
{
System.out.println("Version: " + System.getProperty("java.version"));
}
catch(Exception e)
{
System.out.println("Error version?");
}
}
}
Lo compilo con la maquina 1.6 y lo ejecuto con la 1.4, y obtengo esto:
Exception in thread "main" java.lang.UnsupportedClassVersionError: testVersion (Unsupported major.minor version 50.0)
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:539)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:251)
at java.net.URLClassLoader.access$100(URLClassLoader.java:55)
at java.net.URLClassLoader$1.run(URLClassLoader.java:194)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:187)
at java.lang.ClassLoader.loadClass(ClassLoader.java:289)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:274)
at java.lang.ClassLoader.loadClass(ClassLoader.java:235)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)
Es normal que obtenga el error, lo estoy ejecutando con una máquina inferior a la que lo compiló Lo que me gustaría sería capturar la excepción que salta, evitar que salga ese horrible mensaje, y sacar yo un bonito mensaje de: NECESITAS JAVA 1.6 PARA EJECUTAR ESTA APLICACIÓN!!!
Se puede hacer eso con java o requiero una aplicacion externa que no sea de java para hacerlo?
Muchas gracias!!!!
-
Intenta haciendo algo como esto:
public static void main
(String[] args
) { try {
// ...
}
System.
err.
println("NECESITAS JAVA 1.6 PARA EJECUTAR ESTA APLICACIÓN!!!n" + error_version.
getMessage()); }
}
La verdad no lo he intentado :nosweat: , pero en teoría debería funcionar.
:suerte:
-
mmmmmmm, lamento decir.. que no funciona esa opcion tampoco. Da el mismo error. Aquí el código:
import javax.swing.JFrame;
public class javaVersionTester
{
public static void main(String args[])
{
try
{
System.out.println("Version 1.6 perfecto!");
}
catch (UnsupportedClassVersionError error_version)
{
System.err.println("NECESITAS JAVA 1.6 PARA EJECUTAR ESTA APLICACIÓN!!!n" + error_version.getMessage());
}
}
}
Aqui el error. Ha cambiado, porque he ejecutado en otro ordenador con java 1.5, no 1.4 como en el mail de antes, pero sigue dando la excepcion y no entrando en el catch, que es lo que intento :-S
Exception in thread "main" java.lang.UnsupportedClassVersionError: Bad version number in .class file
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
Gracias de todas formas, y si se ocurre alguna otra opcion, soy todo oidos!!!!!
Ciaoo!!!
-
Bueno lo que se me ocurre es que tú clase principal donde está el main la compiles con la versión más baja de java y el binario lo implementes en conjunto con los demás que son compilados con la versión más reciente de java, es decir que la ejecución sea ascendente y no descendente, ya que este error es porque el binario que se está ejecutando fue compilado en una versión reciente y se está tratando de ejecutar en una versión más baja de forma descendente.
Creo haberme explicado, ahí nos cuentas por favor como te fue.
-
Hola,
Eso lo pense ayer, pero no lo veía claro. Porque si tengo mis clases compiladas con 1.6, y la principal la intento compilar con 1.4, y que llame a la 1.6, no dará un error por intentar compilar clases de la 1.6 junto con la 1.4? no se si me explico.
De todas formas, intentare hacerlo a ver que sale.
Ciaoo!!!
-
Bueno a eso me refería con lo de ascendente y descendente, no lo he verificado, pero en teoría puedes interactuar con versiones de abajo(1.4) hacia arriba(1.6) pero no así lo contrario.
Pero si puedes hazlo y nos cuentas como te fue, y así salimos de la duda todos.