Статьи

JavaFX на JDK 11

После развязывания 11-го выпуска возникла смесь чувств в отношении отделения JavaFX от JDK. Многие из нас чувствовали, что сейчас самое время попрощаться с JavaFX и перейти на другую технологию графического интерфейса, в то время как некоторые другие были рады этому обстоятельству. Они полагали, что отделение JavaFX от рук Oracle и его развитие как проекта с открытым исходным кодом, основанного на сообществе, является фантастической возможностью для JavaFX стать еще лучше. Я принадлежу к последней группе. Хотя я, возможно, обеспокоен тем, как будет развиваться JavaFX, я твердо верю в то, что функции, предоставляемые Java Modularity и JPMS, предоставляют нам, что отдельный модуль JavaFX действительно интересен. Вы можете просто включить этот модуль в свой проект, создать собственный образ времени выполнения, используя инструмент «jlink» и BOOM! У вас просто есть модный модульный проект, который вы можете легко отправить и запустить в другом месте.

JavaFX

Вы можете спросить себя: «Как?». Это в основном то, что я собираюсь проиллюстрировать в этой статье для вас. Я собираюсь показать вам, как вы можете создать модульный проект с 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"?>
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    <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"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    <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"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    <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.

Если у вас есть какие-либо вопросы, пожалуйста, не стесняйтесь спрашивать, я постараюсь ответить на них.

Наконец, Привет, Мир!

JavaFX

Опубликовано на Java Code Geeks с разрешения Мохаммада Римаза, партнера нашей программы JCG. Смотрите оригинальную статью здесь: JavaFX на JDK 11

Мнения, высказанные участниками Java Code Geeks, являются их собственными.