突发奇想的研究了一波在JDK11上跑JavaFX
- 遇到的第一个问题,怎么用maven来处理JavaFX的依赖关系
- 习惯使用maven所以第一想到的就是用maven处理JavaFX于是在某个群里问了一下JavaFX的maven依赖的一个重要指标
<groupId>org.openjfx</groupId>
- 于是乎在maven中央仓库找这个,发现了一组很有节奏感的包
- 点了一个进去看了下,发现版本号跟JDK版本号类似,于是调出了不知道什么时候丢在记忆角落里的一句话,
FX版本跟随JDK版本
,但经发现JDK11也可以使用FX12的库 - 下面是所有FX的依赖,当然版本号嘛自己用哪个自己去仓库看,下面贴一波JDK环境
<properties>
<fx.version>12.0.2</fx.version>
</properties>
<dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-base</artifactId>
<version>${fx.version}</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-graphics</artifactId>
<version>${fx.version}</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>${fx.version}</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-media</artifactId>
<version>${fx.version}</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-web</artifactId>
<version>${fx.version}</version>
</dependency>
<dependency>
<groupId>org.controlsfx</groupId>
<artifactId>controlsfx</artifactId>
<version>11.0.0</version>
</dependency>
<dependency>
<groupId>com.jfoenix</groupId>
<artifactId>jfoenix</artifactId>
<version>9.0.9</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>11</source>
<target>11</target>
</configuration>
</plugin>
<plugin>
<groupId>org.openjfx</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>0.0.3</version>
<configuration>
<mainClass>启动类完全限定名</mainClass>
</configuration>
</plugin>
</plugins>
</build>
实在跑不起来时用此下面的方法
- 写完这个后只能说创建个空白窗口是可以运行的,但是只要一放组件就绝对报一大波错误,其中有一条一定是跟
模块无法访问
有关,跟模块有关, - 哪么就是JDK版本的模块化问题啦,首先应该想到怎么去访问模块,于是进行一波下面的设置,这个设置文件是
module-info.java
我是把它放在src/main/java下的
// login是我的工程名,当然在idea中工程也是一个模块,所以也可以说是某个自己创建的模块名
module login {
requires javafx.base;
requires javafx.controls;
requires javafx.graphics;
// 下面注释掉的在网上有个人解释是暴露这个模块给某些模块访问,这个方法是可行的,我试过了
// opens cn.lotus.app to javafx.graphics,javafx.controls,javafx.base;
// exports这个是将某个包导出去,感觉跟上面的opens效果差不多,可能是写得不够多吧,
// 个人习惯用这种方法,如果没有写opens或exports是运行不了程序的
exports cn.lotus.app;
}