После развязывания 11-го выпуска возникла смесь чувств в отношении отделения JavaFX от JDK. Многие из нас чувствовали, что сейчас самое время попрощаться с JavaFX и перейти на другую технологию графического интерфейса, в то время как некоторые другие были рады этому обстоятельству. Они полагали, что отделение JavaFX от рук Oracle и его развитие как проекта с открытым исходным кодом, основанного на сообществе, является фантастической возможностью для JavaFX стать еще лучше. Я принадлежу к последней группе. Хотя я, возможно, обеспокоен тем, как будет развиваться JavaFX, я твердо верю в то, что функции, предоставляемые Java Modularity и JPMS, предоставляют нам, что отдельный модуль JavaFX действительно интересен. Вы можете просто включить этот модуль в свой проект, создать собственный образ времени выполнения, используя инструмент «jlink» и BOOM! У вас просто есть модный модульный проект, который вы можете легко отправить и запустить в другом месте.
Вы можете спросить себя: «Как?». Это в основном то, что я собираюсь проиллюстрировать в этой статье для вас. Я собираюсь показать вам, как вы можете создать модульный проект с Maven.
Среда:
Я использую JDK 11 на раннем доступе. Вы можете скачать его по этой ссылке: http://jdk.java.net/11/
|
1
2
3
4
|
$ java --versionjava 11-ea 2018-09-25Java(TM) SE Runtime Environment 18.9 (build 11-ea+24)Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11-ea+24, mixed mode) |
И апач мавен
|
1
2
3
4
5
6
|
$ mvn --versionApache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-17T23:03:14+04:30)Maven home: C:\Program Files\Maven\apache-maven-3.5.4Java version: 11-ea, vendor: Oracle Corporation, runtime: C:\Program Files\Java\jdk-11Default locale: en_US, platform encoding: Cp1252OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows" |
Создание проекта:
Мой проект имеет 2 модуля. Один модуль является логикой, а другой — графическим интерфейсом, к которому относится связанный с JavaFX код.
Вот структура проекта:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
javafx11-demo│ pom.xml│├───gui│ │ pom.xml│ ││ └───src│ └───main│ └───java│ │ module-info.java│ ││ └───com│ └───mhrimaz│ └───gui│ GUIMain.java│└───logic │ pom.xml │ └───src └───main └───java │ module-info.java │ └───com └───mhrimaz └───logic CoolLogic.java |
Конфигурирование «pom.xml»:
Это содержимое корневого pom.xml:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
<?xml version="1.0" encoding="UTF-8"?> <modelVersion>4.0.0</modelVersion> <groupId>com.mhrimaz</groupId> <artifactId>javafx11-demo</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <modules> <module>logic</module> <module>gui</module> </modules> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.7.0</version> <configuration> <source>11</source> <target>11</target> <showWarnings>true</showWarnings> <showDeprecation>true</showDeprecation> </configuration> <dependencies> <dependency> <groupId>org.ow2.asm</groupId> <artifactId>asm</artifactId> <version>6.2</version> </dependency> </dependencies> </plugin> </plugins> </build></project> |
По сути, я настраиваю плагин компилятора maven и настраиваю его для Java 11. Обратите внимание, что я определил два модуля: логику и графический интерфейс .
Для модуля логики pom.xml выглядит следующим образом:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
<?xml version="1.0" encoding="UTF-8"?> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.mhrimaz</groupId> <artifactId>javafx11-demo</artifactId> <version>1.0-SNAPSHOT</version> </parent> <artifactId>logic</artifactId> <version>1.0-SNAPSHOT</version> </project> |
Наконец, для модуля gui мы определим его pom.xml следующим образом:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
<?xml version="1.0" encoding="UTF-8"?> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.mhrimaz</groupId> <artifactId>javafx11-demo</artifactId> <version>1.0-SNAPSHOT</version> </parent> <artifactId>gui</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>com.mhrimaz</groupId> <artifactId>logic</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-controls</artifactId> <version>11-ea+19</version> </dependency> </dependencies> </project> |
Обратите внимание, что здесь у нас есть две зависимости: одна — это зависимость от нашего логического модуля, потому что каждому графическому интерфейсу нужна логика, а другая — это зависимость от модуля javafx -controls.
Конфигурирование «module-info.java»:
Если вы не знакомы с концепциями модульности Java, я предлагаю вам прочитать мою другую статью о JPMS и модульности.
Мы должны экспортировать наш пакет «com.mhrimaz.logic», чтобы сделать его доступным вне нашего модуля.
|
1
2
3
|
module logic{ exports com.mhrimaz.logic;} |
Для модуля gui мы должны сделать несколько вещей. Прежде всего, нам нужен модуль логики. Другое дело, что нам нужен модуль javafx.controls . И наконец, мы должны открыть пакет «com.mhrimaz.gui» для доступа с глубоким отражением во время выполнения ради JavaFX. В итоге мы получим следующую конфигурацию:
|
1
2
3
4
5
|
module gui{ requires logic; requires javafx.controls; opens com.mhrimaz.gui to javafx.graphics;} |
Последние шаги:
Чтобы скомпилировать и собрать модули, введите эту команду:
|
1
|
mvn clean install |
Это скомпилирует и соберет модули для вас. У вас будет эта иерархия в конце:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
C:.│ pom.xml│├───gui│ │ pom.xml│ ││ ├───src│ │ └───main│ │ └───java│ │ │ module-info.java│ │ ││ │ └───com│ │ └───mhrimaz│ │ └───gui│ │ GUIMain.java│ ││ └───target│ │ gui-1.0-SNAPSHOT.jar│ ││ ├───classes│ │ │ module-info.class│ │ ││ │ └───com│ │ └───mhrimaz│ │ └───gui│ │ GUIMain.class│ ││ ├───generated-sources│ │ └───annotations│ ├───maven-archiver│ │ pom.properties│ ││ └───maven-status│ └───maven-compiler-plugin│ └───compile│ └───default-compile│ createdFiles.lst│ inputFiles.lst│└───logic │ pom.xml │ ├───src │ └───main │ └───java │ │ module-info.java │ │ │ └───com │ └───mhrimaz │ └───logic │ CoolLogic.java │ └───target │ logic-1.0-SNAPSHOT.jar │ ├───classes │ │ module-info.class │ │ │ └───com │ └───mhrimaz │ └───logic │ CoolLogic.class │ ├───generated-sources │ └───annotations ├───maven-archiver │ pom.properties │ └───maven-status └───maven-compiler-plugin └───compile └───default-compile createdFiles.lst inputFiles.lst |
Теперь как бегать? После долгих поисков и раскопок я не нашел решения для ввода команды maven для запуска проекта, поэтому я сделаю это по старинке.
Основная команда следующая:
|
1
|
java --module-path <all-of-your-modules-jar-file> -m <which-module>/<and-which-class-of-it-you-want-to-run> |
Таким образом, мы собираемся сделать это нашей рукой, я ЗНАЮ, ЭТОГО НЕ ДОЛЖНО БЫТЬ В ЭТОМ СПОСОБЕ, но сдерживай свои ожидания, мой друг. Если кто-нибудь знает лучший способ сделать это, я был бы признателен, чтобы я знал это. Команда:
|
1
|
java --module-path gui\target\gui-1.0-SNAPSHOT.jar;logic\target\logic-1.0-SNAPSHOT.jar -m gui/com.mhrimaz.gui.GUIMain |
Очевидно, что если вы запустите это, вы в конечном итоге увидите эту ошибку:
|
1
2
|
Error occurred during initialization of boot layerjava.lang.module.FindException: Module javafx.controls not found, required by gui |
В основном, это говорит о том, что во время разрешения модуля он не нашел модуль javafx.controls . Все просто, вы должны добавить все модули JavaFX в путь модуля. Последняя команда следующая:
|
1
|
java --module-path gui\target\gui-1.0-SNAPSHOT.jar;logic\target\logic-1.0-SNAPSHOT.jar;"C:\Users\YOURUSERNAME\.m2\repository\org\openjfx\javafx-base\11-ea+19\javafx-base-11-ea+19-win.jar";"C:\Users\YOURUSERNAME\.m2\repository\org\openjfx\javafx-graphics\11-ea+19\javafx-graphics-11-ea+19-win.jar";"C:\Users\YOURUSERNAME\.m2\repository\org\openjfx\javafx-controls\11-ea+19\javafx-controls-11-ea+19-win.jar" -m gui/com.mhrimaz.gui.GUIMain |
Эта команда прекрасно работает на моей машине с Windows. Если вам нужен код, вы можете найти его на моем GitHub.
Если у вас есть какие-либо вопросы, пожалуйста, не стесняйтесь спрашивать, я постараюсь ответить на них.
Наконец, Привет, Мир!
| Опубликовано на Java Code Geeks с разрешения Мохаммада Римаза, партнера нашей программы JCG. Смотрите оригинальную статью здесь: JavaFX на JDK 11
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |

