eclipse新建javafx项目并使用jpackage打包成可运行程序

近期要使用javafx做一个电脑上使用的GUI小工具,所以假期刚好在家学习了一下javafx,把打包步骤在此记录一下。

从jdk11起,javafx就已经交给社区维护了,中国官网地址:https://openjfx.cn/

环境

jpackage打包需要java14以上的jdk版本,所以我下载了jdk17,可以去oracle下载,jdk17开发者版本下载地址:https://www.oracle.com/cn/java/technologies/downloads/#jdk17-windows
下载之后配置好JAVA_HOME PATH ClASS_PATH等环境变量,这里省略。

安装好之后cmd运行 jpackage 看看能不能用,能用说明安装成功了。

maven要配好国内仓库源,这里也省略。

步骤

1.新建项目
2.打成jar包
3.利用jdk17 jpackage命令行打包成可运行程序

eclipse新建javafx maven项目

eclipse新建File -> New -> Project... -> Maven -> Maven project


img_ab5fd5026934494d8e933685f27e3b08.jpg

下一步 选择Add Archetypes... groupId: org.openjfx artifactId: javafx-archetype-fxml version:0.0.6


img_294b9ad5bb334960b60645e9aecd2c4d.jpg

点击ok,Filter填入org.openjfx 选择javafx-archetype-fxml


img_6d8660a968634eeb9c0d6f0014669765.jpg

下一步 groupId:org.openjfx artifactId:hellofx javafx-version:19 javafx-maven-plugin-version:0.0.8 点击完成


img_5db05a21b419464f979e50a2ea094a1b.jpg

项目出现之后,eclipse默认jdk11,可以在File -> Properties -> Java Build Path -> Libraries修改jdk的版本,当然jdk11也是可以的

修改下pom.xml

<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.openjfx</groupId>
    <artifactId>hellofx</artifactId>
    <version>0.0.1</version>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <maven.compiler.release>11</maven.compiler.release>
        <javafx.version>19</javafx.version>
        <javafx.maven.plugin.version>0.0.8</javafx.maven.plugin.version>
        <javapackager.version>1.6.7</javapackager.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>${javafx.version}</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>${javafx.version}</version>
        </dependency>
        <!-- <dependency>
            <groupId>io.github.fvarrui</groupId>
            <artifactId>javapackager</artifactId>
            <version>${javapackager.version}</version>
        </dependency> -->
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <release>${maven.compiler.release}</release>
                    <source>${maven.compiler.source}</source>
                    <target>${maven.compiler.target}</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>${javafx.maven.plugin.version}</version>
                <executions>
                    <execution>
                        <!-- Default configuration for running -->
                        <!-- Usage: mvn clean javafx:run -->
                        <id>default-cli</id>
                        <configuration>
                            <mainClass>org.openjfx.hellofx.App</mainClass>
                            <launcher>app</launcher>
                            <jlinkZipName>app</jlinkZipName>
                            <noManPages>true</noManPages>
                            <stripDebug>true</stripDebug>
                            <noHeaderFiles>true</noHeaderFiles>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            
            <!-- 构建jar包plugin -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.2.0</version>
                <configuration>
                    <archive>
                        <addMavenDescriptor>false</addMavenDescriptor>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>org.openjfx.hellofx.App</mainClass>
                        </manifest>
                        <manifestEntries>
                            <Class-Path>./</Class-Path>
                        </manifestEntries>
                    </archive>
                </configuration>
            </plugin>
            <!-- 在打包阶段将依赖的jar包导出到lib目录下 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <type>jar</type>
                            <includeTypes>jar</includeTypes>
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

可以看到上面加入了构建jar包plugin在打包阶段将依赖的jar包导出到lib目录下 两个插件

右击项目Maven->Update Project...一下
修改下module-info.java

module hellofx {
    requires javafx.controls;
    requires javafx.fxml;
    requires transitive javafx.graphics;
    requires javafx.base;

    opens org.openjfx.hellofx to javafx.fxml;
    exports org.openjfx.hellofx;
}

用Run as->Maven Build...执行clean javafx:run启动项目或者直接进入App.java运行主类,可以看到项目正常运行并出现了窗口。


img_fbe05366f53d4bfead8c8edaff997ea2.jpg

打包

Run as->Maven Build...执行clean package进行打jar包
打包成功,在target文件夹出现了hellofx-0.0.1.jar和lib文件夹
把hellofx-0.0.1.jar移动到lib文件夹使其在同一个文件夹下
把一个ico图标也复制到lib文件夹里,作为程序的图标

这里推荐一个png转ico的网站:https://convertico.com/

img_37d3341f2b2f4a83b1f5d4ef41e359b5.jpg

cmd打开lib文件夹 执行jpackage打包命令

jpackage --type app-image -n DemoApp -p . -m hellofx/org.openjfx.hellofx.App --vendor zhaohy --app-version 0.0.1 --icon ./TV.ico

稍等片刻后,即可打包成功。在lib下面出现了一个DemoApp的文件夹,进去双击DemoApp.exe


img_976f2cfd36f746c2b8d563074ce9da72.jpg

可以看到运行成功。

上面命令里各参数:

--type 或 -t <键入字符串>
#要创建的包的类型
#有效值为:{"app-image", "exe", "msi", "rpm", "deb", "pkg", "dmg"}
#如果未指定此选项,则将创建一个与平台相关的默认类型。

--name 或 -n <name>
#应用程序和/或程序包的名称。 

-p . 代表当前路径

-m 代表module-info.java里的模块名和包路径

--vendor <字符串>
#应用程序的供应商。 

--app-version <版本>
#应用程序和/或软件包的版本 

--icon 图片路径

更多jpackage解释请看:https://www.bilibili.com/read/cv14523427?spm_id_from=333.999.0.0
上面这位大神从Oracle官方文档翻译的,讲的比较全。

关于javafx,贴一个我发现的宝藏up教程:https://space.bilibili.com/5096022/channel/collectiondetail?sid=210809

关于非模块化打包

上面的示例是javafx模块化的打包方式,很多时候用到的第三方jar包不一定支持模块化,所以记录一下改成非模块化之后遇到的这些坑。

从模块化转成非模块化非常简单,只要把根目录的module-info.java删除就好了,但是直接删除之后,它也直接运行不了启动类了。

所以得新建一个类单独做启动,这个类就是一般的启动类就好,不要继承Application。
比如新建Launch .java

package org.openjfx.hellofx;

import javafx.application.Application;

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

直接运行Launch类的main方法就可以启动javafx项目了。

非模块化的打包和模块化的打包命令是有点区别的,前期步骤都一样:
1.先运行 clean package命令打出jar包
2.把项目jar包移到target/lib目录下
3.把图标ico复制到target/lib目录下
4.用cmd打开target/lib 此时这里有所有的业务jar包和依赖包和图标ico文件
运行以下命令:

jpackage --type app-image -n DemoApp  -i D:\work\workspace2\hellofx\target\lib --main-jar hellofx-0.0.1.jar --main-class org.openjfx.hellofx.Launch --app-version 0.0.1 --icon ./TV.ico --dest D:\work\workspace2\out

-i:指的是需要打包的输入地址
--main-jar:业务jar包名称
--main-class: 业务jar包里的启动类名称指定,只有在--main-jar指定之后,这个才有效。
--dest:输出安装包的文件夹目录
上面的文件夹地址换成自己真实的就ok.
--dest这个一定要指定,如果不指定默认会在当前目录陷入打包死循环,不要问我是怎么知道的,不知道是不是jpackage的bug(捂脸),谨记。

如此,就可以打包出非模块化的可执行程序包,亲测可以成功运行。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容