Solución:
Siempre que tenga un proyecto JavaFX 11 simple (no modular) (sin las herramientas de compilación de Maven / Gradle) y esté utilizando IntelliJ, como la muestra de HelloFX de aquí, así es como puede crear un jar desde IntelliJ que se puede ejecutar desde la consola
Puede encontrar un tutorial completo sobre cómo ejecutar el proyecto aquí, y las instrucciones sobre cómo crear un jar están aquí (consulte la sección Proyecto no modular), pero estas no cubren Artifacts
de IntelliJ.
Verifique que el proyecto HelloFX se ejecute desde IntelliJ con estas opciones de VM:
--module-path ${PATH_TO_FX} --add-modules javafx.controls,javafx.fxml
dónde PATH_TO_FX
se ha establecido en File -> Settings -> Appearance & Behavior -> Path Variables
, apuntando a la biblioteca JavaFX SDK.
Semi tarro de grasa
Podemos crear un Jar que solo contenga las clases del proyecto y dependencias de terceros, pero no las de JavaFX.
Ir a File -> Project Structure -> Artifacts -> Add -> JAR -> From modules with dependencies
, agregue su clase principal, acepte.
Luego eliminar los frascos de JavaFX de la lista y aceptar.
Construya el proyecto, creará un frasco bastante pequeño (3 KB en este caso).
Ahora debería poder ejecutarlo como:
java --module-path %PATH_TO_FX% --add-modules javafx.controls,javafx.fxml -jar outartifactsHelloFX_jarHelloFX.jar
(Asegúrate de eso %PATH_TO_FX%
apunta a una carpeta válida y usa comillas si contiene espacios.
Puede distribuir este jar y ejecutarlo en otras plataformas, siempre que estas también tengan el SDK de JavaFX.
Tarro de grasa
Si desea un jar completo que incluya dependencias de JavaFX, aún puede usar Artifacts.
Ir a File -> Project Structure -> Artifacts -> Add -> JAR -> From modules with dependencies
, agregue su clase principal, acepte.
Luego mantener los frascos de JavaFX de la lista y aceptar. Construye el proyecto.
En teoría, debería poder ejecutarlo como:
java -jar outartifactsHelloFX_jarHelloFX.jar
Pero esto no funcionará.
Razón 1: necesita una clase de iniciador, como se explica aquí.
Entonces crea una clase de lanzador:
public class Launcher {
public static void main(String[] args) {
Main.main(args);
}
}
Razón 2: si solo agrega sus tarros SDK al tarro gordo, se perderán las bibliotecas nativas, como se explica aquí.
Así que edite el artefacto, seleccione la clase Lanzador como clase principal y agregue las bibliotecas nativas (Directory Content -> path-to/JavaFX SDK/bin
en Windows):
Ahora compile el proyecto (ahora el jar tiene aproximadamente 33 MB y contiene bibliotecas nativas innecesarias) y ejecute:
java -jar outartifactsHelloFX_jarHelloFX.jar
Puede distribuir este jar, pero solo a plataformas Windows.
Puede crear archivos jar similares para otras plataformas, si descarga sus SDK de JavaFX, y también puede crear archivos jar multiplataforma si los agrega todos juntos, como se explica en las respuestas vinculadas arriba.
De todos modos, deberías considerar usar jlink
en lugar de.
Nota
Acerca de este error:
Causado por: java.lang.ClassNotFoundException: Files Java javafx-sdk-11.0.1 lib
parece que la ruta de la biblioteca se estableció sin comillas y falta la primera parte de la ruta C:Program Files...
. Solo asegúrate de usar comillas:
set PATH_TO_FX="C:Program FilesJavajavafx-sdk-11.0.1lib"
Tuve un problema similar al exportar / generar un Jar usando JavaFX e IntelliJ no modular con Gradle (https://openjfx.io/openjfx-docs/)
El jar que estaba generando usando el comando jar de Gradle no se ejecuta y arroja un error que dice que no puede encontrar mi clase principal. Cuando abrí mi frasco, pude ubicar mi clase principal. Entonces me di cuenta de que el error tiene que ver con Jar Packaging.
Solucioné el problema agregando JavaFX SDK a mi Java SDk en IntelliJ como se muestra a continuación.
Después de esto, utilizo el comando Gradle build Jar normal para generar mi archivo Jar (como se muestra a continuación) y se ejecuta normalmente.