После развязывания 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 --version java 11 -ea 2018 - 09 - 25 Java(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 --version Apache Maven 3.5 . 4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018 - 06 -17T23: 03 : 14 + 04 : 30 ) Maven home: C:\Program Files\Maven\apache-maven- 3.5 . 4 Java version: 11 -ea, vendor: Oracle Corporation, runtime: C:\Program Files\Java\jdk- 11 Default locale: en_US, platform encoding: Cp1252 OS 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 layer java.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, являются их собственными. |