Proyecto Maven con JavaFX (con archivo jar en `lib`)

Estoy configurando un proyecto maven, que va a usar JavaFX. Como he escuchado que JavaFX no viene con todas las versiones de Java, descargué y puse el archivo jfxrt.jar en un directorio lib en mi proyecto.

1) ¿Cómo especifico que la dependencia (es decir, JavaFX) no se debe descargar, pero que se encuentra en lib ?

2) ¿Significa esto que el proyecto se puede construir en cualquier máquina con JDK (y no es necesario JDK 1.7 – actualización 9+)?

Enfoque sugerido

Para construir aplicaciones JavaFX con Maven:

  1. Utilice un plugin maven JavaFX Y / O
  2. Usar Java 8 no especifica ningún tipo de dependencia Maven para JavaFX.

A diferencia de Java 7, con Java 8 no es necesario establecer JavaFX como una dependencia de maven, porque JavaFX se encuentra en el classpath de tiempo de ejecución Java estándar (similar a la forma en que Swing es hoy en día).

Opinión

Creo que el enfoque en su pregunta de colocar el archivo jfxrt.jar en un directorio de lib proyecto es defectuoso.

Las razones por las que está defectuoso son:

  1. JavaFX también incluye bibliotecas nativas, por lo que debería incluirlas también (en una ubicación donde jfxrt.jar podría encontrarlas).
  2. Una versión determinada de JavaFX solo estará certificada para operar contra la versión del JDK con la que se envía, por lo que el tiempo de ejecución JavaFX que coloque en el directorio lib su proyecto puede no funcionar contra una versión posterior de JDK, como JDK 8.
  3. Las versiones futuras de JDK, como JDK 8, incluirán JavaFX en la ruta de clase predeterminada del JDK, por lo que puede tener conflictos con la versión que coloca en su directorio lib .

En resumen, JavaFX debe tratarse como parte del sistema de tiempo de ejecución de Java, no como una biblioteca de proyectos.

Muestra de dependencia del sistema JavaFX

Si debe utilizar Java 7 y no desea utilizar el complemento maven de JavaFX, puede tomar el enfoque menos recomendado:

  • Haga referencia a la biblioteca JavaFX desde jdk (no su directorio lib proyecto) como una dependencia del sistema maven .

Este ejemplo se proporciona únicamente para Java 7 y no es necesario (y no funciona tal cual) para Java 8. Java 8, coloca jfxrt.jar en $ {java.home} /lib/ext/jfxrt.jar, que es en la vía de acceso de clase de tiempo de ejecución predeterminada de Java, lo que hace que la dependencia del sistema para Java 8 sea irrelevante.

  javafx jfxrt ${java.version} system ${java.home}/lib/jfxrt.jar  

Si empaqueta su aplicación usando una dependencia del sistema como esta, necesitará escribir algunas instrucciones de ejecución para sus usuarios para que puedan agregar jfxrt.jar al classpath en tiempo de ejecución cuando ejecute su aplicación en Java 7. Esto es una muy buena razón para no usar este enfoque.

Si opta por utilizar el enfoque de dependencia del sistema maven, también puede utilizar el plugin maven antrun para incrustar llamadas a las tareas ant JavaFX como en este ejemplo . Es posible que también desee utilizar el complemento maven enforcer para asegurarse de que su aplicación esté construida al menos contra la versión mínima requerida de Java que contiene una versión JavaFX requerida por su aplicación para funcionar.