2012-01-24 28 views
12

que sé un poco acerca de JDK y JRE fuente y la compatibilidad binaria (por ejemplo this y this), pero no está seguro acerca de la siguiente situación:JDK, JRE una compatibilidad JAR

Considere Tengo una aplicación que se compila utilizando JDK5 y funciona en JRE6. Utiliza algunas bibliotecas (jarras) que también se compilan utilizando JDK5.

Ahora quiero compilar mi aplicación usando JDK6. ¿Qué nuevos problemas podrían surgir en tiempo de ejecución en tal caso (particularmente, en compatibilidad con los "viejos" tarros)? ¿Debo volver a probar completamente la aplicación (tocar cada biblioteca) o puedo confiar en la compatibilidad prometida con JDK/JRE?

+0

posible duplicado de [¿Hay algún ejemplo específico de incompatibilidades hacia atrás entre las versiones de Java?] (Http://stackoverflow.com/questions/1654923/are-herehere-any-specific-examples-of-backward-incompatibilities-between -java-versi) –

Respuesta

2

Desarmado ya menos que no haya cambiado su código y agregado nuevas características de Java 6, no debería haber problemas. Con respecto a otros frascos, no debería haber ningún problema. JDK siempre mantiene la compatibilidad con versiones anteriores.

+0

"_JDK siempre mantiene la compatibilidad hacia atrás_" Al menos engañosa: vea la pregunta vinculada en los comentarios al OP. – Alberto

2

La compatibilidad funciona principalmente. No esperaría que surgiera ningún problema para usted aparte de varias advertencias por ej. no usando genéricos Tal vez algunas API apenas utilizadas estaban en desuso, pero supongo que se dejaron en su lugar, simplemente se marcó como obsoleto.

Inténtelo, si lo compila debería estar bien.

Un aspecto clave del diseño de Java - lamentablemente - es la compatibilidad con versiones anteriores.

Hay muy pocas excepciones en las que la compatibilidad con versiones anteriores no se conservó; lo más destacado de Eclipse sufrió cuando el algoritmo de ordenación cambió de un algoritmo de ordenamiento estable a uno no estable (el orden de los objetos que se clasifican de manera idéntica ya no se conservaba); pero eso nunca fue parte de la especificación de Java, sino un error en Eclipse.

Es desafortunado, porque había unas pocas opciones malas que ahora no se pueden cambiar. Iterator no debería haber tenido una función remove() en la API, Vector no debería haberse sincronizado (resuelto teniendo ArrayList ahora), StringBuffer no debería haberse sincronizado, de ahí StringBuilder. String probablemente debería haber sido una interfaz, no una clase, para permitir, p. Cadenas de 8 bits, cadenas de 32 bits: CharSequence es la mejor interfaz de cadenas, pero hay demasiados métodos que no aceptan CharSequence y requieren devolver String. Observable también debería ser una interfaz: no se puede hacer una subclase observable con esta API. Para nombrar unos pocos. Pero debido a la compatibilidad con versiones anteriores, no se pueden arreglar más hasta que tal vez la modularización JDK (en ese momento, algunos pueden al menos desaparecer en un módulo donotuse ...).

Por supuesto que ya debe tener miles de equipo realiza un test para ayudarle a probar con el nuevo JDK ... :-)

+0

Y TAMBIÉN también debería intentar ejecutar la unidad compilada, si es ejecutable ... utilizando la máquina virtual de Java prevista que lanzará la que se utiliza en producción. De esa forma, supongo que verifico compatibilidad. – Victor

+0

Para ser sincero, "_Sólo inténtalo, si cumple [sic] deberías estar bien_" me parece un enfoque demasiado arriesgado: todavía temería problemas inesperados en el tiempo de ejecución. Entonces el -1 (que no puedo deshacer sin editar la respuesta) aún se cumple. – Alberto

+0

Java tiene altos requisitos de compatibilidad con versiones anteriores. Se supone que tienen un extenso conjunto de pruebas también. Entonces, a menos que hicieran algunos feos ataques en aquel entonces, el código debería ser compatible; porque todos los métodos deberían estar allí, tal como estaban. Y si no escribieron pruebas ... –

9

Normalmente no hay problemas si surge si se establece la opción de compilador de JDK6 a use 1.5 compatibilidad de fuente. Sin embargo, a veces esto no siempre es cierto.

Recuerdo una vez cuando compilé el código 1.4 con el compilador 1.5 (usando compatibilidad con 1.4). Las jarras estaban bien (nivel binario 1.4) pero la aplicación se bloqueó debido a una conversión divertida.

Utilizamos un número BigDecimal pasando un entero como argumento al constructor. El 1.4 version tenía solo un constructor desde double pero el 1.5 version tenía ambos, el int y el double constructores. Por lo tanto, al compilar con el compilador 1.4 realizó la conversión automática de int a double, pero con el compilador 1.5 comprobó que el constructor int existía y no se dio cuenta de esa conversión. Luego, al usar el código binario compatible perfecto en 1.4 JRE, el programa se bloqueó con un NoSuchMethodException.

Tengo que admitir que fue un caso extraño, pero es uno de esos casos donde la lógica no funciona. Así que mi consejo es que si planea compilar para versiones anteriores de JRE intente usar la versión de destino JDK siempre que sea posible.

+0

@Igor, del documento de compatibilidad JDK: 7. Java SE 6 Rechaza correctamente las versiones ilegales La implementación de cast se adhiere más a la Especificación del lenguaje Java. En general, esto significa que javac aceptará más programas. Sin embargo, en algunos casos excepcionales, javac ahora puede rechazar programas previamente aceptados pero incorrectos. http://www.oracle.com/technetwork/java/javase/compatibility-137541.html#incompatibilities En realidad tengo 1 de estos problemas. – alexsmail

+1

Por supuesto que pueden haber problemas de compatibilidad mejorados. Mi caso fue 1.4-> 1.5 migración. Y 1.3-> 1.4 fue incluso peor (1.3 estaba muy roto) –

+0

Perdón por resucitar este problema. He leído mal la pregunta y he votado en contra, y después de volver a leer me siento obligado a deshacer mi voto. No estoy seguro de que su la situación descrita coincide con la del OP. ¿Estás hablando solo de compatibilidad de fuente ('-source'), o también acerca de la compatibilidad del objetivo (' -target')? Y mencionó que compiló con un JDK5 para ejecutar en un JRE1.4. El OP compila con JDK5 para JRE6 y actualizaciones para compilar con JDK6 para JRE6. Tu situación parece muy diferente. Pero si no lo recuerdas, olvídalo de todos modos (ya he votado a favor, y esto podría servir como advertencia para otros) – Alberto

Cuestiones relacionadas