2011-09-29 26 views
9

Estoy interesado en usar algunas de las características de NIO2 en el SDK de Java 7 si está disponible (específicamente, file system watchers), sin embargo no quiero compilar mis clases para Java 7 y excluir Java 6 tiempos de ejecución. Sobre todo porque quiero mantener la compatibilidad con Mac OS X, y también porque no quiero forzar a mis usuarios a actualizar.Uso de las características de Java 7 SDK en Java 6

¿Esto es posible? ¿Cuál es la mejor manera de hacerlo? Cualquier enlace o ejemplos?

Aquí hay algunas maneras en que me puedo imaginar: compilar un archivo de clase con un compilador diferente y cargarlo dinámicamente en función de la versión de Java? ¿O tal vez usando la reflexión? ¿O tal vez solo hay una configuración de compilador para Java 7 para generar clases compatibles con Java 6?

Estoy buscando una solución que no se convierta en un lío feo :), así que idealmente puedo escribir dos implementaciones de una interfaz, una con las nuevas funciones y otra sin, y luego seleccionar una de forma dinámica en lugar de tener para hacer llamadas reflexivas por todo el lugar.

+0

Como supongo que estas características comenzaron a existir en SE7, ¿cómo crees que podrás compilar con un modo de compatibilidad SE6 y conservarlas? – KevinDTimm

+0

Lo que quiero hacer es usarlos solo cuando el programa se ejecuta en un entorno de ejecución Java 7, y recurrir a otros comportamientos si no es así. Tenga en cuenta que estoy hablando de las características del SDK de Java 7, no de las características del lenguaje. –

+0

Lo lamentamos, serán necesarias dos bases de código (o, al menos, tener una base de manejo de archivos separada para cada entorno y crear salidas separadas para cada versión ya que el código compilado en la Versión X generalmente no funciona en ninguna versión de menor número) – KevinDTimm

Respuesta

9

Simplemente compile con -target 1.6 y organice su código para que pueda capturar ClassNotFoundExceptions y NoClassDefFoundErrors limpiamente alrededor de los módulos que usan 1.7. Tal vez cargarlos con un cargador de clases separado, por ejemplo.

+0

¡Funciona, gracias! Configuré JDK 7 en Eclipse para encargarme del resaltado de sintaxis, y lo construí con el objetivo Java 6. Para las llamadas a métodos que no existen, debes coger el NoSuchMethodError. –

+0

@Laurens @EJP. No lo entiendo, ¿cómo podrías construir la fuente 1.7 con -target 1.6? No le daría: 'javac: la versión de origen 1.7 requiere la versión de destino 1.7' – Pacerier

+0

@Pacerier El truco consiste en compilar con la fuente 1.6 en lugar de 1.7, e invocar los métodos desde la 1.7 SDK. Puede necesitar alguna configuración en su editor para evitar que se queje y que la finalización del código funcione, pero de lo contrario simplemente funciona. –

0

Para algunos elementos que se agregaron en Java 7, es posible que pueda encontrar los jars de Java 6 jsr que le dan la funcionalidad. Sin embargo, no creo que este sea el caso para File System Watcher.

+0

Si se ejecuta en Java 6, no necesito la funcionalidad, es opcional para los usuarios que ejecutan Java 7. En este caso particular, probablemente retroceder en el sondeo o comportamiento de actualización explícito. –

+3

Considera JNotify –

0

En cuanto a los observadores del sistema de archivos, antes de Java 7 solo solía sondear las propiedades de un archivo cada pocos segundos para comprobar que no había cambiado. No es exactamente bueno, pero prácticamente no utiliza recursos notables y desde la perspectiva del usuario final parece funcionar de la misma manera.

Si buscas una biblioteca más completa, echa un vistazo a http://commons.apache.org/jci/commons-jci-fam/index.html - Creo que hace algo similar, aunque nunca lo he usado.

Especificando la fuente 1.7 y el objetivo 1.6 Estoy bastante seguro de que no funcionará, lo intenté por un motivo diferente hace un tiempo y desde la memoria la JVM se quejó de las banderas incompatibles (mi suposición es por la nueva dinámica invocada en 7 .)

1

Puedes construir fácilmente para java 1.6 como lo ha señalado Toolkit. Sin embargo, debe asegurarse de no acceder accidentalmente a ningún método que no exista en java 6. Esto causará una excepción de tiempo de ejecución en su código de producción.

Si usa maven, puede usar maven-enforcer-plugin que se asegura de que ninguna clase de Java 1.7 o llamadas de método se cuelen en su código creado para 1.6.

Un ejemplo sería el cambio de Java 1.4 a 1.5. Yo estaba construyendo con 1,5 con una meta de 1,4, y solía accidental:

new BigDecimal(5); 

Este compila bien, y funcionó muy bien para mí. Pero debido a que el cliente todavía estaba usando 1.4, falló. Porque este constructor no existe en 1.4. Fue introducido en 1.5.

Otra solución sería construir un par de jarras, una con las cosas nuevas nio, una con las cosas viejas, y detectar en el momento de la instalación si el usuario estaba ejecutando Java 1.7 o no. De ser así, agregue el jar que contiene la implementación apropiada.

Cuestiones relacionadas