martes, 17 de marzo de 2020

JavaFX (1) Mi primera toma de contacto. Muchos problemas y mucho google para solucionarlos!

1. Introdución


Me hace falta realizar una pequeña aplicación de escritorio que funcione tanto en Windows como en Linux.
Parece ser que javaFX és una de las pocas opciones que me quedan, pero he tenido un complicado camino para que funcionase.

2. Pasos que he seguido

He seguido las instrucciones que indica en la web de la comunidad  pero al final he tenido que descartar algunas opciones. Veamos resumidamente los pasos, por tanto merece la pena que te apoyes en la página oficial como aclaración y detalle:

1. Crear un proyecto maven y seleccionar el arquetipo "javafx-archetype-fxml" (ya que el arquetipo "javafx-archetype-simple" da muchos problemas) Te deja meter la versión 0.05

2. En fichero maven "pom.xml" selecciona el JDK 14, pero el plugin "javafx-maven-plugin", seleccionar la versión "0.0.3" (pues la versión "0.0.4" da muchos problemas)

3. Al final me he enterado que un proyecto "modular" es el que tiene el fichero "module-info.java" que cualga directamente de la carpeta "src/main/java".

4. A veces el pom.xml se queja de que no existe el fichero MANIFEST.MF, para no de el error, he creado este fichero en blanco dentro de la carpeta "src/main/resources/META-INF", y ya no da la lata.

5. Ejecutar el proyecto: Tal y como se dice le damos al boton derecho encima del nombre del proyecto y "Run As" -> Maven build .. y del damos a goals: "clean javafx:run". Y parece que funciona.

6. Crear una imagen: Igual que antes le damos al boton derecho encima del nombre del proyecto y "Run As" -> Maven build .. y del damos a goals: "clean javafx:jlink".... pero "con la iglesia hemos topado amigo Sancho...", veamos por qué:

6.1 Si utilizamos librerias regulares como apache-commons, ya no deja hacer la imagen y sale este error


[DEBUG] Executing command line: [/usr/java/jdk-13.0.2/bin/jlink, --module-path, /home/eduard/WorkspaceFX/JavaFX01/target/classes:/home/eduard/.m2/repository/commons-io/commons-io/2.6/commons-io-2.6.jar:/home/eduard/.m2/repository/org/apache/commons/commons-compress/1.20/commons-compress-1.20.jar:/home/eduard/.m2/repository/org/openjfx/javafx-base/14/javafx-base-14-linux.jar:/home/eduard/.m2/repository/org/openjfx/javafx-controls/14/javafx-controls-14-linux.jar:/home/eduard/.m2/repository/org/openjfx/javafx-fxml/14/javafx-fxml-14-linux.jar:/home/eduard/.m2/repository/org/openjfx/javafx-graphics/14/javafx-graphics-14-linux.jar, --add-modules, ximodante.JavaFX01, --output, /home/eduard/WorkspaceFX/JavaFX01/target/image, --compress, 2, --launcher, launcher=ximodante.JavaFX01/ximodante.JavaFX01.App]
Error: automatic module cannot be used with jlink: org.apache.commons.io from file:///home/eduard/.m2/repository/commons-io/commons-io/2.6/commons-io-2.6.jar
[ERROR] Command execution failed.

  O sea no podemos utilizar librerías automáticas como apache-commons (que son aquellas que parece ser toman las rutas del classpath y no del manifest??). Por tanto no podemos hacer nada ya

6.2 Si no utilizamos estas librerias y conseguimos que funcione el dichoso "clean javafx:jlink", nos genera una carpeta "image" en la carpeta  "target" que no hay quien se aclare ppara poder utilzar dicha imagen. para ello hay que modificar el "pom.xml" y meter al menos una entrada "launcher" tal y como se indica en rojo. al menos crea un fichero "mylauncher" que si cliclamos sobre él, ejecuta la aplicación. Ver read-me del github del javafx-maven-plugin


<build>
  <plugins>

    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.8.1</version>
      <configuration>
        <release>13</release>
      </configuration>
    </plugin>
           
            
    <plugin>
      <groupId>org.openjfx</groupId>
       <artifactId>javafx-maven-plugin</artifactId>
       <version>0.0.3</version> <!--version 0.0.4 doesn't work -->
       <configuration>
          <launcher>mylauncher</launcher>
          <mainClass>ximodante.JavaFX01.App</mainClass>
       </configuration>
    </plugin>

  </plugins>
</build>


6.3 Ya tenemos una imagen que parece que funciona, pero con la restricción de no usar librerias regulares.... Pero si la hemos hecho con linux... NO FUNCIONA CON WINDOWS. Cabreo que he cogido!

6.4 Estoy trabajando con openjdk 13.02, pero he tenido que instalar el Openjdk 11, pues a veces daba algún problema. Pero una vez instalado la versión 11, aunque utilizaba la 13, ya no he tenido mas problemas

3. En busca de soluciones

Hay un español llamado José Pereda Llamas que sabe muchísimo de todo esto. Tiene algunas intervenciones en stackoverflow  que són lujo y vale la pena verlas. Os adelanto algunas:

Package a non modular java application. -> Muy bueno pues explica las distintas forma de empaquetar/distribuir aplicaciones javafx.

JavaFX application runs fine when running Main in IntelliJ, built jar doesn't run -> Explica errores comunes que aparecen al intentar empaquetar o lincar una aplicacion javaFX

Error: “Package is declared 'javafx.beans.value' in module 'foo.bar'” -> Explica diferentes manera de empaquetar una aplicación con graddle.

Maven Shade JavaFX runtime components are missing -> Explica como empaquetar las librerias para windows, lunix y mac en un jar. Muy importante

Este señor tiene muchas intervenciones en StackOverflow, y buscando por todas partes he encontrado una solución que parece que soluciona los problemas. Se ve en la próxima entrada



1 comentario :

  1. Me parece muy raro que uno tecnología pensada para crear aplicaciones de escritorio sea tan complicado solo crear el proyecto. Me ha pasado algo similar tengo una parte de una aplicación con Java Swing y estaba evaluando si la pasaba a JavaFX pero con tanto lío mejora la dejo en Swing

    ResponderEliminar