jlink no usa módulos automáticos

Sep 11 2020

Creé un archivo '.exe' para una aplicación JavaFX en Windows 10 usando jpackage. Posteriormente, al hacer doble clic en el icono de la aplicación, la aplicación no se inició. Me di cuenta de que usé por error este comando, que no está diseñado para ninguna aplicación modular:

jpackage --input app-directory --main-jar jar-file [--main-class main-class]

Ahora estoy tratando de usar la sintaxis de comando adecuada del documento de Oracle para la aplicación modular:

jpackage --module-path module-path --module main-module[/class]

Aquí está mi comando basado en la sintaxis dada por Oracle:

jpackage -p "%JAVAFX_HOME%\lib;%M2_REPO%;org\openjfx\mavenfxedittableview\mavenfxedittableview.jar" --module "org.openjfx.mavenfxedittableview/org.openjfx.mavenfxedittableview.TableEditApp"

Sin embargo, recibo un error con respecto a que jlink no usa módulos automáticos: El mensaje de error:

WARNING: Using incubator modules: jdk.incubator.jpackage
jlink failed with: Error: automatic module cannot be used with jlink: javafx.swt from file:///C:/Program%20Files/java/jFX/javafx-sdk-14.0.2.1/lib/javafx-swt.jar

El nombre de mi módulo de aplicación en module-info.class es

module org.openjfx.mavenfxedittableview {
requires javafx.controls;
requires javafx.fxml;
requires java.base;
requires java.prefs;
requires transitive java.xml.bind;

opens org.openjfx.mavenfxedittableview to java.xml.bind, javafx.fxml;
exports org.openjfx.mavenfxedittableview;
    
}

La aplicación principal es org.openjfx.mavenfxedittableview.TableEditApp y la estructura del directorio org \ openjfx \ mavenfxedittableview es una ruta relativa dentro del directorio "c: \ sample".

Las clases de construcción son:

 Directory of C:\Sample\org\openjfx\mavenfxedittableview

09/09/2020  10:32 PM    <DIR>          .
09/09/2020  10:32 PM    <DIR>          ..
09/09/2020  08:36 PM             2,502 addressBookData.xml
09/09/2020  08:36 PM             9,562 Address_Book.png
09/09/2020  08:36 PM               859 birthdaystatistic.fxml
09/09/2020  08:36 PM             3,274 BirthdaystatisticController.class
09/09/2020  08:36 PM             3,224 DarkTheme.css
09/09/2020  08:36 PM             2,072 DateUtil.class
09/09/2020  08:36 PM             1,214 LocalDateAdapter.class
09/09/2020  10:32 PM            34,004 mavenfxedittableview.jar
09/09/2020  08:36 PM             3,523 Person.class
09/09/2020  08:36 PM             4,535 personeditdialog.fxml
09/09/2020  08:36 PM             5,128 PersoneditdialogController.class
09/09/2020  08:36 PM             1,029 PersonListWrapper.class
09/09/2020  08:36 PM             6,412 personoverview.fxml
09/09/2020  08:36 PM             1,904 rootlayout.fxml
09/09/2020  08:36 PM             4,490 RootlayoutController.class
09/09/2020  08:36 PM             9,060 TableEditApp.class
09/09/2020  08:36 PM             6,812 TableVieweditController.class
              17 File(s)         99,604 bytes
               2 Dir(s)  56,574,193,664 bytes free 

Aquí está el contenido del archivo jar de la aplicación:
     0 Wed Sep 09 22:32:14 IRDT 2020 META-INF/
   125 Wed Sep 09 22:32:14 IRDT 2020 META-INF/MANIFEST.MF
  2502 Wed Sep 09 20:36:28 IRDT 2020 org/openjfx/mavenfxedittableview/addressBookData.xml
  9562 Wed Sep 09 20:36:28 IRDT 2020 org/openjfx/mavenfxedittableview/Address_Book.png
   859 Wed Sep 09 20:36:28 IRDT 2020 org/openjfx/mavenfxedittableview/birthdaystatistic.fxml
  3274 Wed Sep 09 20:36:30 IRDT 2020 org/openjfx/mavenfxedittableview/BirthdaystatisticController.class
  3224 Wed Sep 09 20:36:28 IRDT 2020 org/openjfx/mavenfxedittableview/DarkTheme.css
  2072 Wed Sep 09 20:36:30 IRDT 2020 org/openjfx/mavenfxedittableview/DateUtil.class
  1214 Wed Sep 09 20:36:30 IRDT 2020 org/openjfx/mavenfxedittableview/LocalDateAdapter.class
  3523 Wed Sep 09 20:36:30 IRDT 2020 org/openjfx/mavenfxedittableview/Person.class
  4535 Wed Sep 09 20:36:28 IRDT 2020 org/openjfx/mavenfxedittableview/personeditdialog.fxml
  5128 Wed Sep 09 20:36:30 IRDT 2020 org/openjfx/mavenfxedittableview/PersoneditdialogController.class
  1029 Wed Sep 09 20:36:30 IRDT 2020 org/openjfx/mavenfxedittableview/PersonListWrapper.class
  6412 Wed Sep 09 20:36:28 IRDT 2020 org/openjfx/mavenfxedittableview/personoverview.fxml
  1904 Wed Sep 09 20:36:28 IRDT 2020 org/openjfx/mavenfxedittableview/rootlayout.fxml
  4490 Wed Sep 09 20:36:30 IRDT 2020 org/openjfx/mavenfxedittableview/RootlayoutController.class
  9060 Wed Sep 09 20:36:30 IRDT 2020 org/openjfx/mavenfxedittableview/TableEditApp.class
  6812 Wed Sep 09 20:36:30 IRDT 2020 org/openjfx/mavenfxedittableview/TableVieweditController.class
   349 Wed Sep 09 22:32:14 IRDT 2020 module-info.class


Este es el archivo de manifiesto jar:

Manifest-Version: 1.0
Main-Class: org.openjfx.mavenfxedittableview.TableEditApp
Created-By: 14.0.2 (Oracle Corporation)

Finalmente, descubrí este complemento de Maven ModiTect:

https://www.youtube.com/watch?v=BhuOSGrNBek

, que incrusta un descriptor en el archivo jar de un módulo automático, sin embargo, sería extremadamente tedioso y consumiría mucho tiempo ya que el módulo automático culpable ni siquiera está en mi descriptor de módulo. Esto implica que podría tener que pasar por el repositorio .m2 y convertirlos uno por uno. ¿Hay mejores soluciones alternativas?

Gracias

Respuestas

mipa Sep 11 2020 at 15:21

Es posible que desee seguir este tutorial: https://github.com/dlemmermann/JPackageScriptFXTambién usa jpackage y jlink pero de una manera que lo hace utilizable para proyectos no modulares. No puede usar jlink directamente porque no admite módulos automáticos, pero este problema se puede evitar simplemente no usando el sistema de módulos en absoluto.