JavaFX打包为exe文件

2023-11-19

JavaFX打包为exe文件

传统的Java打包为exe文件是先打包成.jar的可执行文件,再用exe4j打包为exe文件,可以参考Java项目打包成exe的详细教程 - Jepson6669 - 博客园 (cnblogs.com)。该方法较为繁琐,而且对Maven的文件目录并不友好。Maven中有一个为JavaFX开发的打包插件,可以直接将软件打包为exe文件,并集成JRE运行时环境。GIT地址为:https://github.com/javafx-maven-plugin/javafx-maven-plugin

一、配置插件及打包

插件在POM中的配置方法如下:

<build>
  <plugins>
    <plugin>
      <groupId>com.zenjava</groupId>
      <artifactId>javafx-maven-plugin</artifactId>
      <version>8.8.3</version>
      <configuration>
        <vendor>公司、组织、项目标识(此处需进行配置)</vendor>
        <mainClass>主类全类名(此处需进行配置)</mainClass>
      </configuration>
    </plugin>
  </plugins>
</build>

注意主类的全类名需要包含包名,如主类为Main,放在com.scw包中,则全类名为com.scw.Main

打包时,打开CMD,定位到POM文件所在目录,然后输入mvn jfx:native进行打包,打包的文件会放在target/\jfx\native

二、注意事项

2.1 串口开发的兼容性

经测试,如果使用JaveFX和RXTXComm进行上位机开发,然后使用该插件进行打包,打包后的软件会在向串口发送数据时直接闪退,原因不明。解决方法是使用JSerialComm代替RXTXComm。JSerialComm的使用可以参考 Java串口通信-JSerialComm_水刺猬的博客-CSDN博客

2.2 资源文件的读取

打包后的文件目录如图:

其中TestReportCreater-0.0.1-SNAPSHOT.exe是主程序,app目录下的TestReportCreater-0.0.1-SNAPSHOT-jfx.jar是打包后的jar文件。经测试,打包后的程序中,图片类文件可以通过.getClass().getResource(String fileName)从jar文件中读取,但是其他资源类文件比如xml和css文件无法读取。可以尝试通过将文件转为InputStream来读取,也可以将资源直接复制到app目录下,然后通过System.getProperty("user.dir")获取到app目录,然后再读取

但是这样一来打包前会无法获取到资源,所以可以对需要获取资源的地方添加一个判断,如果不能通过.getClass().getResource(String fileName)获取到资源,再转为通过System.getProperty("user.dir")获取资源。

URL image = this.getClass().getResource(path);
File logoFile = null;
File logoFile = new File(image.getFile());
if(image == null || logoFile == null || !logoFile.exists()) {
	logoFile = new File(System.getProperty("user.dir")+path);
}

如果觉得每次都要复制资源太麻烦,可以用下面的函数来自动将资源的InputStream流写入到根目录下

public File readFile(String path) throws IOException {
	File file = new File(this.getClass().getResource(path).getFile());
	if(file.exists() && file.length()!=0) {
		return file;
	}//判断是否可以直接获取资源文件。在打包前能直接获取资源文件时,会直接返回文件。打包后,由于获取不到资源文件,会从jar中读取文件流,然后写入到/app目录下(jar包的目录)
	file = new File(System.getProperty("user.dir")+path);//在根目录创建文件
	if(!file.getParentFile().exists()) {
			file.getParentFile().mkdirs();
	}
	if(!file.exists()) {
		file.createNewFile();
	}
	InputStream is = this.getClass().getResourceAsStream(path);//获取jar包内的资源流
	OutputStream os = new FileOutputStream(file);
	int len = -1;
	byte[] b = new byte[1024];
	while((len = is.read(b))!=-1) {
		os.write(b,0,len);
	}//将资源流写入文件
	is.close();
	os.close();
	return file;
}

参考资料

Maven将JavaFX项目打包为exe(集成JRE)_tom_gy_的博客-CSDN博客_javafx maven 打包

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaFX打包为exe文件 的相关文章

随机推荐

  • XDOJ目录操作

    目录操作 类别 字符串处理 时间限制 1S 内存限制 256Kb 问题描述 在操作系统中 文件系统一般采用层次化的组织形式 由目录 或者文件夹 和文件构成 形成一棵树的形状 有一个特殊的目录被称为根目录 是整个文件系统形成的这棵树的根节点
  • Android自定义控件(四)---实战篇(详解onDraw)

    讲到这里 这个案例基本上快结束了 在绘制 onDraw 方法中 唯一的难点就是文字 基线的确定 这点请大家务必弄清楚 废话不多说 上码 首先 我们先不管基不基线的 先让文字显示出来再说 package com example mytextv
  • 深度学习虚拟环境在不同机器之间的迁移

    不同机器之间虚拟境的复制 假设有两台机器 都用的是anaconda配置虚拟环境的 且虚拟环境都在anaconda3 envs 目录下 那么复制虚拟环境可以直接将一台机器anaconda3 envs 目录下的虚拟环境 对应该目录下的一个文件夹
  • uniapp微信小程序引入threeJs并导入模型

    前言 我的需求是使用uniapp写微信小程序 在小程序中使用threeJs就行了 目前暂不考虑兼容app什么的 1 引入小程序版的threejs库实现 2 使用webview实现 推荐 重点 我的建议是使用这个库 https github
  • React页面设计初体验

    1 定制路由 export default login path login name login component layouts BlankLayout routes path login component Login Index
  • 跟我一起写Shell脚本之十八--常用命令(head)

    1 介绍 head也是我们经常在脚本中用到的一个命令 主要用来显示文件的开头部分内容 我们可以用man head查看下它的介绍 NAME head output the first part of files SYNOPSIS head O
  • Spring系列之@Aspect中@Pointcut 12种用法

    先了解几个概念 文中会涉及几个概念 先了解一下 target 用来表示目标对象 即需要通过aop来增强的对象 proxy 代理对象 target通过aop增强之后生成的代理对象 AspectJ AspectJ是什么 AspectJ是一个面向
  • [C++]备忘录模式

    备忘录模式 Memento Pattern 保存一个对象的某个状态 以便在适当的时候恢复对象 备忘录模式属于行为型模式 github源码路径 https github com dangwei 90 Design Mode 此文件包含 mai
  • Error:Cannot build artifact xxx:war exploded’ because it is included into a circular dependency 解决方法

    我报的错误是day0601和day1202冲突 试了网上的方法删除了idea中artifact中重复文件并没有解决问题 在网上找了很久也没解决 后来自己试了一下 这样操作以后我这个就不会报循环依赖的错误了
  • 天使投资和风险投资有何区别?

    7月5日 天使投资人张青永 左 和创业者胡宁波 右 做客雅虎 谈融资知识和技巧 以下内容摘自实录 主持人 我觉得 赢在中国 的目的就达到了 那进入我们今天的主题就是融资基础知识和技巧 这是一个很专业化的知识 大家对这个并不太清楚 比如天使投
  • 全网最详细IDEAvim配置(.ideavimrc)

    IDEAvim 写在前面 本配置文件用到的插件如下 IdeaVim IdeaVim EasyMotion IdeaVimExtension which key Vim快捷键提示插件 CodeGlance Pro 右侧代码小地图 Transl
  • Python下载库超时Connection to files.pythonhosted.org timed out问题解决(换源)

    一年没用Python 这突然有节课老师让用Python 用就用吧 一来就是一个下马威 pip版本太低不支持 更新还更新不了 就是超时 官网也进不去 抓狂中 按照提示命令更新 更新超时 哇呀呀呀 我们还是冷静下来分析以下问题吧 错误信息提示连
  • 一些常见BootLoader介绍

    首先区分一下BootLoader和Monitor的概念 严格来说 BootLoader只是引导设备并且执行主程序的固件 而Monitor还提供了更多的命令行接口 可以进行调试 读写内存 烧写Flash 配置环境变量等 Monitor在嵌入式
  • Qt自定义界面类并提升(提升的窗口部件)

    1 用Qt Creator新建一个自定义Widget 类名自定义为 QMyForm 2 在Qt Creator自带的设计师里面 把普通的Wiget提升为自定义的QMyForm 选择菜单 提升为 3 手动输入提升的类名 QMyForm 然后点
  • [lightm显示]ubuntu卡在启动界面

    解决lightdm刚下载 重启电脑ubuntu卡在紫色启动界面 1 重启电脑 2 进入恢复模式下的root 3 命令行输入 4 命令行输入reboot 环境 ubuntu20 04 解决 把显示管理器重新改回gdm3即可 1 重启电脑 2
  • 知识图谱之知识融合

    最近在 小象学院 上知识图谱的课程 做了一些笔记 现整理了一下 1 什么是知识融合 将来自不同知识库的同一实体融合在一起 目标 融合各层面的知识 合并两个知识图谱 本体 需要确认的是 1 等价实例 实体的匹配 左右两个人是同一个人 sams
  • 在python中使用pyspark读写Hive数据操作 --转载

    1 读Hive表数据 pyspark读取hive数据非常简单 因为它有专门的接口来读取 完全不需要像hbase那样 需要做很多配置 pyspark提供的操作hive的接口 使得程序可以直接使用SQL语句从hive里面查询需要的数据 代码如下
  • Intent.addFlags() 启动Activity的20种flags

    前言 在使用startActivity时候出现异常 Caused by Android util AndroidRuntimeException Calling startActivity from outside of an Activi
  • STL之set常见用法详解

    摘自胡凡的 算法笔记 仅作记录用 前言 set是一个内部自动有序且不含重复元素的容器 如果要使用set 需要添加set头文件 即 include
  • JavaFX打包为exe文件

    JavaFX打包为exe文件 传统的Java打包为exe文件是先打包成 jar的可执行文件 再用exe4j打包为exe文件 可以参考Java项目打包成exe的详细教程 Jepson6669 博客园 cnblogs com 该方法较为繁琐 而