JavaFX项目基础应用 Graalvm打包javafx项目成exe

JavaFX项目基础应用

官网:JavaFX 国区官网:JavaFX中文官方网站

软件下载

1: javafx sdk下载 地址:JavaFX下载 | JavaFX中文官方网站 下载对应java的版本,一般分java11、java17长期版本,java8版本只有b测版本

2:source builder图形界面下载 地址:Scene Builder | JavaFX中文官方网站 下载对应java版本,分java8和java11+的版本

3:安装文档 get-start说明: Getting Started with JavaFX

IDEA与javaFX

IDEA下载fx插件(高版本自带)

setting -> plugins -> javaFX -> install

 

Languages & FreameWorks -> javaFX -> Path to SceneBuilder -> {SceneBuilder安装目录}

 

1:直接看官网的配置

教程地址: Getting Started with JavaFX

2:自己创建

新建Maven项目配置

File -> New -> Project -> Maven -> Create from archetype -> Add archetype

参数: groupId -> org.openjfx artifactId -> javafx-maven-archetypes version -> 0.0.6

 

选择刚刚创建的archetype进入下一步

新建项目属性 GroupId(com.demo) Artfactid(HelloFX) Version(1.0-SNAPSHOT)

 

下一步修改archetypeArtifactId为 javafx-archetype-fxml ,新增javafx为11.0.2 (下载的版本 java11版本javafx需要低于17)

 

如上配置,打开正常构建后悔自动添加javaFX配置与插件

 

新建一个Main应用程序,写入

public class Main {
​
    public static void main(String[] args) {
        Application.launch(App.class);
    }
}

启动Main程序

 

修改pom.xml打包为可执行jar包配置

添加如下2个插件

   <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.2.0</version>
                <configuration>
                    <archive>
                        <!-- MANIFEST.MF设置 -->
                        <manifest>
                            <!-- 依赖包路径-->
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <!-- 启动类-->
                            <mainClass>com.demo.Main</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>

 

执行启动jar包

 

打包注意点:

假如系统多个java版本,导致maven编译时jdk版本不一致时,修改maven编译运行版本 Setting -> Build,Execution,Deployment -> Build Tools -> Maven -> Run -> 修改为需要的版本

 

Graalvm打包JavaFX

添加依赖pom

(这里下载使用java11和graalvm版本20.3.5)

<properties>属性下添加

<graal-sdk.version>20.3.5</graal-sdk.version>

<dependencies>依赖下添加sdk

<dependency>
    <groupId>org.graalvm.sdk</groupId>
    <artifactId>graal-sdk</artifactId>
    <version>${graal-sdk.version}</version>
    <scope>provided</scope>
</dependency>

构建的属性<plugins>插件下添加native-image镜像插件 在根目录下新建bin文件

<plugin>
    <groupId>org.graalvm.nativeimage</groupId>
    <artifactId>native-image-maven-plugin</artifactId>
    <version>${graal-sdk.version}</version>
    <executions>
        <execution>
            <goals>
                <goal>native-image</goal>
            </goals>
            <phase>package</phase>
        </execution>
    </executions>
    <configuration>
        <skip>false</skip>
        <imageName>HelloFX</imageName>
        <mainClass>com.demo.Main</mainClass>
        <buildArgs>
            --force-fallback --native-image-info
        </buildArgs>
        <!-- 打包输出配置  需要根目录下新建bin文件-->
        <outputDirectory>
              bin/
        </outputDirectory>
    </configuration>
</plugin>

项目复制到C盘

(和native-image指令同一个驱动盘)

项目封装exe

打开打包窗口

 

执行打包命令mvn clean package

 

打包完成示意图

 

到bin执行exe文件,完美执行

 

正常运行

 

graalvm新技术特点

把exe和jar包复制到其他windows系统也能正常执行,并且启动内存减少、启动速度提高

打包注意点:

graalvm_home 和 native-image 和 pom.xml 的 graal-sdk 版本一致

必须使用x64 Native Tools Command Prompt for VS 2019窗口执行native-image打包,不然会出现cl.exe找不到的错误

项目打包路径必须与graalvm同一个驱动盘(基本都在C盘),否则会出现 'other' has different root错误

===========graalvm官网 下载地址:GraalVM 快速启动地址:GraalVM

====================完整的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.demo</groupId>
    <artifactId>HelloFX</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <graal-sdk.version>20.3.5</graal-sdk.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>15.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>15.0.1</version>
        </dependency>
​
        <dependency>
            <groupId>org.graalvm.sdk</groupId>
            <artifactId>graal-sdk</artifactId>
            <version>${graal-sdk.version}</version>
            <scope>provided</scope>
        </dependency>
​
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <release>11</release>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>0.0.5</version>
                <executions>
                    <execution>
                        <!-- Default configuration for running -->
                        <!-- Usage: mvn clean javafx:run -->
                        <id>default-cli</id>
                        <configuration>
                            <mainClass>com.demo.App</mainClass>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.2.0</version>
                <configuration>
                    <archive>
                        <!-- MANIFEST.MF设置 -->
                        <manifest>
                            <!-- 依赖包路径-->
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <!-- 启动类-->
                            <mainClass>com.demo.Main</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.graalvm.nativeimage</groupId>
                <artifactId>native-image-maven-plugin</artifactId>
                <version>${graal-sdk.version}</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>native-image</goal>
                        </goals>
                        <phase>package</phase>
                    </execution>
                </executions>
                <configuration>
                    <skip>false</skip>
                    <imageName>HelloFX</imageName>
                    <mainClass>com.demo.Main</mainClass>
                    <buildArgs>
                        --force-fallback --native-image-info
                    </buildArgs>
                     <!-- 打包输出  需要根目录下新建bin文件-->
                     <outputDirectory>
                        bin/
                    </outputDirectory>
                </configuration>
            </plugin>
        </plugins>
    </build>
​
</project>

版权声明:本文为ailice001原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。