leftso 3030 0 2018-08-30 07:54:12

logo-cover-JDK11上的JAVAFX
    在第11次发布之后,人们对JavaFX与JDK脱钩产生了各种各样的感受。我们中的许多人认为现在是时候告别JavaFX并转而采用另一种GUI技术,而其他一些人则对这种情况感到高兴。他们认为将JavaFX从Oracle手中解耦并将其开发作为一个开源的社区驱动项目,这是JavaFX获得更大成功的绝佳机会。我属于后一组。虽然我可能会担心JavaFX的发展方式,但我坚信Java Modularity和JPMS为我们带来的功能,拥有一个单独的JavaFX模块实际上是非常吸引人的。您可以将该模块包含到项目中,使用“jlink”工具和BOOM创建自定义运行时映像!

你可能会问自己,“怎么样?”。这基本上就是我将在本文中为您说明的内容。我将向您展示如何使用Maven创建模块化项目。
 

环境

我在Early Access上使用JDK 11。您可以从以下链接下载:JDK 11 下载地址
$ 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)
和Apache Maven
$ 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相关代码所属的gui
这是项目结构:
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”:

这是root pom.xml的内容:
$title(pom.xml)
<?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"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <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配置它。请注意,我定义了两个模块:logicgui
对于逻辑模块,pom.xml如下所示:
$title(pom.xml)
<?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"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <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定义如下:
$title(pom.xml)
<?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"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <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>
请注意,这里我们有两个依赖项,一个是对逻辑模块的依赖,因为每个gui都需要一个逻辑,另一个是对javafx -controls模块的依赖。

配置“module-info.java”:

如果您不熟悉java模块化概念,我建议您阅读我关于JPMS和模块化的其他文章。
我们应该导出我们的“com.mhrimaz.logic”包,以便在我们的模块之外访问它。
module logic{
    exports com.mhrimaz.logic;
}
对于gui模块,我们应该做几件事,首先,我们应该要求逻辑模块。另一件事是我们应该要求javafx.controls模块。最后,为了JavaFX,我们应该为运行时深度反射访问打开“com.mhrimaz.gui”包。我们将最终得到以下配置:
module gui{
    requires logic;
    requires javafx.controls;
    opens com.mhrimaz.gui to javafx.graphics;
}

最后的步骤:

要编译和构建模块,请输入以下命令:
mvn clean install
这将为您编译和构建模块。最后您将拥有此层次结构:
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命令来运行项目,所以我会以一种老式的方式来做。
基本命令如下:
java --module-path <all-of-your-modules-jar-file> -m <which-module>/<and-which-class-of-it-you-want-to-run>
因此,我们将通过我们的手来实现,我知道,它不会以这种方式支持,但保持低我的朋友的期望。如果有人知道更好的方法,我将不胜感激,让我知道。命令是:
java --module-path gui\target\gui-1.0-SNAPSHOT.jar;logic\target\logic-1.0-SNAPSHOT.jar -m gui/com.mhrimaz.gui.GUIMain
很明显,如果你运行它,你最终会看到这个错误:
Error occurred during initialization of boot layer
java.lang.module.FindException: Module javafx.controls not found, required by gui
基本上,它说在模块解析期间,它没有找到javafx.controls模块。这很简单,您应该将所有JavaFX模块添加到模块路径中。最后的命令如下:
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上找到它
如果您有任何疑问,请不要犹豫,我会尽力回答。

最后,Hello World!

Hello World JAVA FX
Hello World JAVA FX
编程技术 jdk11 java FX