JavaFX11 入门
Java11及之后的版本中,JavaFX不再内置,需要另外引入。可以通过直接下载jar文件引入,也可以通过maven引入。创建项目需要下载JavaFX11的JDK和Jmods(用于模块化打包),下载地址为JavaFX - Gluon (gluonhq.com)。在页面中勾选Include older versions
,然后在上方的筛选条件里选择适合的版本,这里选择JavaFX11,windows系统,64位版。然后点击下方的Download
下载SDK和jmods文件,下载后分别解压,将解压后的javafx-sdk-11
文件夹放在Java的安装目录下(如C:\Program Files\Java
),将Jmods
解压得到的文件复制到jdk下的jmods目录下(如C:\Program Files\Java\jdk-11.0.9\jmods
)。注意不是将文件夹整体复制进去,而是将jmods
文件夹中的.jmod
文件复制进去。(这一步的复制并不是必须的,主要用于模块化打包时方便定制jre环境)
一、使用Java11及Maven构建JavaFX11程序(使用Eclipse)
在Eclipse中新建一个Maven项目,配置jdk版本为11,并引入JavaFX11的依赖
<!--设置编码为UTF-8,并配置jdk版本为11.注意,如果在Maven的setting文件中配置了jdk版本,这里的配置不会生效 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<!-- 引入JavaFX11 -->
<dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>11</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>11</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
新建一个主类,继承Application,编写界面
package com.scw;
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.HBox;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.stage.Stage;
public class Main extends Application{
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) throws Exception {
Text text = new Text("Hello JavaFX11");
text.setFont(Font.font("微软雅黑", FontWeight.BOLD, 20));
Button button = new Button("Button");
HBox hbox = new HBox();
hbox.setPrefSize(400,300);
hbox.setAlignment(Pos.CENTER);
hbox.getChildren().addAll(text,button);
Scene scene = new Scene(hbox);
stage.setScene(scene);
stage.show();
}
}
此时直接运行会报错错误:缺少JavaFX运行时组件,需要使用该组件来运行此程序
。解决方法有两个,一个是配置JVM的启动项,将JavaFX的JDK目录添加进启动项里。点击Eclipse菜单栏的Run -> Run Configurations
,在Java Application
中找到刚才写的主类,点击右侧窗口中的(x)=Arguments
,在下方的VM argument
中输入:
--module-path "C:\Program Files\Java\javafx-sdk-11\lib" --add-modules javafx.controls,javafx.fxml,javafx.base
其中--module-path
后跟JavaFX所造的目录。点击Apply应用配置,再次启动时就可以成功启动了。
另一种方法是新建一个启动类,用新的启动类来启动主类,绕开JavaFX对于运行时组件的检查
package com.scw;
public class AppLauncher {
public static void main(String[] args) {
Main.main(args);
}
}
二、打包jar
使用maven的插件来打包成jar文件,maven配置如下:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<!-- 加载主类 -->
<mainClass>com.puri.scw.AppLauncher</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
注意<mainClass>
中的值为主类的启动类。
然后在项目pom.xml
所在目录下打开CMD,输入:
mvn clean package
会在target
目录下生成两个文件。文件名带有original
的是不包含依赖的jar包,另一个是带有依赖项的jar包。运行时需要运行带有依赖项的jar包。
如果电脑上已配置Java环境变量,并且安装的是Java11,此时可以直接在cmd中运行该文件,如
java -jar target\HelloJavaFX.jar
如果能够运行,则表明程序没有问题
三、定制jre环境(使用jlink)
使用jdeps
命令来检查jar文件的依赖项
jdeps --module-path "C:\Program Files\Java\javafx-sdk-11\lib" --list-deps target\HelloJavaFX-1.jar
其中,--module-path
后面的是Javafx sdk所在目录,--list-deps
命令用于打印所有的依赖项
输出如下:
java.base
javafx.base
javafx.graphics
我们定制jre时,就需要这三个依赖。输入下面的命令来生成一个定制的jre
jlink --module-path jmods --add-modules java.base,javafx,base,javafx.graphics --output myjre
其中--module-path
后面的是jmods所在目录。--add-modules
后面是要添加的依赖项,--output
后面是输出jre的目录。上面的命令会在当前目录下生成一个myjre
文件夹,文件夹内即定制的jre环境
如果之前没有把下载的JavaFX Jmods文件复制进jdk的Jmods文件夹,这里会报错。将文件复制进去即可。
注意,如果安装的是Java11并且已经配置了环境变量,可以直接使用jdeps和jlink命令,否则要完整输入jdk\bin文件目录
生成jre环境后,可以通过jre环境来运行生成的jar文件,看是否能正常运行
myjre\bin\java.exe -jar target\HelloJavaFX.jar
如果能正常运行,则定制的环境没有问题。
注意:如果电脑上配置了Java8的环境变量,这里即使使用定制的jre环境,程序仍然会运行失败,需要删除配置的Java8环境变量才能正常运行。
四、打包exe文件(使用exe4j)
exe4j
软件可以自行在网上下载。安装后需要配置一个license
,否则打包的exe文件每次启动时都会弹窗提示软件是exe4j打包的。
安装后打开软件,点击Next,在下一个页面里选择JAR in EXE mode
点击Next,在页面的第一栏输入程序名,第二栏选择程序的保存目录。最好和jar文件放在同一个目录,否则会需要把资源文件复制进exe文件所在目录才能运行
点击Next,在Executable name
后输入exe文件的名称。可以在Icon File
中指定程序图标。下面的第一个选项是是否只同时允许一个程序运行。最好勾选上,否则程序错误不显示界面时,有可能会发生很多个程序同时在后台占用资源的问题
在Advanced Options
中,可以选择是否生成64位程序。鉴于目前大部分电脑都是64位的,可以勾选上。然后点击页面下方的next,进入Configure options for the executable manifest
页面。这个页面没有要改动的,直接点击next,进入Configure Java invocation
页面。在这个页面选择jar文件,并在下方的Main class from
后输入启动类的完整 名。如果打包后的软件中文乱码,可以在VM Parameters
中设置编码。输入后点击next
在这个页面中输入软件的最大和最小Java版本。这里都输入11,因为是使用自己打包的jre环境。输入后,点击Advanced Options -> Search sequence
,设置jre环境的选择顺序
在新的页面中,删掉所有的jre环境,点击绿色的加号,勾选Directory
,然后选择定制的jre所在目录。最好将jre复制到输出文件目录中。设置完后,点击next
在这个页面选择Client hotspot VM
(也可以用默认值),然后点击三次next,可以在输出文件目录下看到生成的exe文件
如果程序使用了资源文件,必须将资源文件复制进来才可以运行。
五、打包exe安装包(使用Inno Setup Compiler)
生成exe文件后,可以使用Inno Setup Compiler来进一步生成安装文件。如果之前生成的exe文件可以运行,那么这一步几乎不会出现问题。
六、一些备注
生成exe后的含jre运行环境的文件夹大约有100M,使用Winrar压缩后大约有40M,后续生成的exe安装文件大约也是40M