JavaFX打包为exe文件

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 打包

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值