He creado un módulo com.company.ep
que se encuentra en la carpeta de origen com.company.ep
. (Sí, me he retirado src
de la trayectoria de la estructura y borrado!) Dentro de la carpeta de origen, tengo un par de paquetes como los siguientes:
com.company.ep <--- root source folder
com.company.ep.main <--- package 1
com.company.ep.model <--- package 2
com.company.ep.view <--- package 3
// ... more packages
module-info.java
La clase principal se encuentra en el paquete com.company.ep.main.Main
. En mi module-info.java
, He configurado las dependencias:
module com.company.ep {
exports com.company.ep.main;
exports com.company.ep.model;
exports com.company.ep.view;
// ... more exports
requires javafx.controls;
requires javafx.graphics;
}
Cuando traté de lanzar mi programa, eclipse me dijo que:
Error occurred during initialization of boot layer
java.lang.module.FindException: Module javafx.controls not found, required by com.company.ep
Por lo tanto, traté de ejecutarlo en el símbolo del sistema:
java -p d:\Applications\openjfx-sdk-11\lib;bin -m com.company.ep/com.company.ep.main.Main
bin
es la carpeta de salida del eclipse, y funcionó .
Por lo tanto, fui a Properties → Run/Debug Settings → Main → Show Command Line
, mostró:
D:\Applications\openjdk-11.0.1\bin\javaw.exe -Dfile.encoding=UTF-8 -p "D:\Development\Eclipse-Workspace\MyProject\bin" -classpath "D:\Applications\openjfx-sdk-11\lib\javafx.base.jar;D:\Applications\openjfx-sdk-11\lib\javafx.controls.jar;D:\Applications\openjfx-sdk-11\lib\javafx.fxml.jar;D:\Applications\openjfx-sdk-11\lib\javafx.graphics.jar;D:\Applications\openjfx-sdk-11\lib\javafx.media.jar;D:\Applications\openjfx-sdk-11\lib\javafx.swing.jar;D:\Applications\openjfx-sdk-11\lib\javafx.web.jar;D:\Applications\openjfx-sdk-11\lib\javafx-swt.jar" -m com.company.ep/com.company.ep.main.Main
He creado una biblioteca de usuario con todos los JAR añadido, y se añade a la biblioteca del proyecto ModulePath .
Luego he tratado de establecer la ruta de forma explícita en el módulo VM arguments
en Run/Debug Settings
: -p D:\Applications\openjfx-sdk-11\lib
, me sigue sin suerte.
Mis preguntas son:
- ¿Por qué
javaw.exe
? - ¿Por qué
classpath
? A medida que se añade mi biblioteca como una entrada ruta_módulo. - Cómo configurar las dependencias del módulo en eclipse.
No estoy seguro de si he configurado Eclipse correctamente, o si es probable que sea un problema de OpenJDK, ya que trabajó cuando trabajaba en otro equipo con Oracle Java SE instalado.
¡Gracias!
La explicación de por qué Eclipse falla en el funcionamiento de su proyecto modular se puede encontrar en los documentos OpenJFX para Eclipse (IDE modulares de la sección).
Como ya se mencionó:
Al ser un proyecto modular, y desde ya añadimos la biblioteca JavaFX SDK para el módulo de la ruta, no hay necesidad de añadir ningún argumento de VM.
Sin embargo, si se ejecuta en Eclipse obtendrá el error mencionado:
Un error ocurrió durante la inicialización de java.lang.module.FindException capa de arranque: javafx.graphics módulo no encontraron, requerido por hellofx
¿Por qué es fallando ??
Como se explica en la documentación:
Esta excepción se debe a que la tarea ant Eclipse anula el ruta_módulo
¿¿Como sucedió esto??
Comprobación de la línea de comandos aplicado ( Show Command Line
desde Ejecutar configuraciones ...), se puede averiguar por qué:
$JAVA_HOME/bin/java -Dfile.encoding=UTF-8 \
-p bin/hellofx \
-classpath $PATH_TO_FX \
-m hellofx/org.openjfx.MainApp
Si lo copia y lo pega y lo ejecuta en un terminal, se producirá un error, por supuesto, con el mismo mensaje. La razón es que Eclipse no añade la biblioteca JavaFX a la ruta del módulo.
Si la tarea genera los argumentos equivocados, vamos a tratar de solucionarlo mediante la adición de nuestros propios argumentos de VM mediante la edición de configuraciones de ejecución ... y sumando -p $PATH_TO_FX:bin/hellofx
.
Pero si lo ejecuta, se producirá un error de nuevo.
Let cheque de por qué, con el Show Command Line
de Ejecutar configuraciones ...
$JAVA_HOME/bin/java -Dfile.encoding=UTF-8 \
-p $PATH_TO_FX:bin/hellofx \
-p bin/hellofx \
-classpath $PATH_TO_FX \
-m hellofx/org.openjfx.MainApp
Como se puede ver, argumentos de VM del usuario se añaden antes de los argumentos de la tarea de hormigas por defecto, por lo que hay dos -p
( --module-path
) opciones, y el primero de ellos (uno de los usuarios con los tarros de JavaFX) se sustituye con la segunda (sólo el módulo del proyecto ), por lo que, de nuevo, los frascos JavaFX no se añaden a la ruta del módulo, y por lo tanto se obtiene el error.
Entonces, ¿cómo podemos solucionarlo ??
Como se ha mencionado en la documentación vinculada, el arreglo posible es:
Para evitar este problema, haga clic en Ejecutar -> Ejecutar configuraciones ... -> Java Application -> Dependencias, seleccione Dependencias Override ... y añadir
-p /path-to/javafx-sdk-11/lib:bin/hellofx
, y pulse Ignorar.
Con esta solución, se puede ver que funciona, y se puede comprobar la línea de comandos:
$JAVA_HOME/bin/java -Dfile.encoding=UTF-8 \
-p $PATH_TO_FX:bin/hellofx \
-p bin/hellofx \
-classpath $PATH_TO_FX \
-p /path-to/javafx-sdk-11/lib:bin/hellofx \
-m hellofx/org.openjfx.MainApp
Básicamente estamos añadiendo de nuevo la opción de ruta del módulo "derecho", después de todos los fracasados.
Mientras que ahora el proyecto se ejecuta, la solución no es, obviamente, muy agradable.
Aquí se puede encontrar una muestra que se refiere a la documentación OpenJFX.
EDITAR
Sobre la base de los comentarios @kleopatra, otra solución para hacer que funcione es la siguiente:
Por alguna razón, el JavaFX11 biblioteca (que contiene frascos modulares) no se analiza y Eclipse no incluye esos frascos en su -p
opción, pero en la ruta de clase:
$JAVA_HOME/bin/java -Dfile.encoding=UTF-8 \
-p bin/hellofx \
-classpath $PATH_TO_FX \
...
Pero, si usted agrega esos frascos directamente a la ruta del módulo, lo hará añadirlos, y esto va a funcionar muy bien:
$JAVA_HOME/bin/java -Dfile.encoding=UTF-8 \
-p bin/hellofx:$PATH_TO_FX/javafx.base.jar:...:$PATH_TO_FX/javafx.controls \
...
Entonces, con esto no hay más necesidad de anular las dependencias.
EDIT 2
Como @mipa señala en un comentario, hubo un error presentado en este tema, y que ya ha sido resuelto. Lo he probado con Eclipse 2018-12 M2 Identificación (4.10.0M2) Cuerpo: 20181108 hasta 1653, y funciona con la JavaFX11
biblioteca sólo (como debe ser):
$JAVA_HOME/bin/java -Dfile.encoding=UTF-8 \
-p bin/hellofx:$PATH_TO_FX/javafx.base.jar:... \
-m hellofx/org.openjfx.MainApp