JavaFX打包exe+Wind+Mac+Linux多平台分发等等

由于此教程相对复杂,适合对java有一定掌握的同学操作,于是我又写了一篇用idea简单打包exe的教程,文章地址:https://blog.csdn.net/weixin_44480167/article/details/121374415
新手请访问上面的文章

如果使用java -jar xxx.jar一堆窗口不好看,分发不方便,我们可以使用packr来打包exe,网上教打包exe的基本上都是用什么exe4j麻烦还不知道干啥的,基本不成功!现在是2021年11月14日15:21:51
思路可以参考这篇文章:https://blog.csdn.net/weixin_44480167/article/details/120895260

下面我将一个简单javafx的demo打包成exe,若你想打包成mac、linux什么的可以按照我下面的思路试试,家境贫寒无法测试mac,若你成功了请告诉我,嘿嘿。
环境:jdk17 + javafx17
保姆式打包教程、保姆式打包教程、保姆式打包教程、保姆式打包教程、保姆式打包教程、保姆式打包教程、
多图警告、多图警告、多图警告、多图警告、多图警告、多图警告、

一、创建一个demo

你可以使用idea2021.2.x高版本创建一个demo,可参考文章:https://blog.csdn.net/weixin_44480167/article/details/121316802

这里我将使用普通的Maven项目,第一步肯定是依赖啦:

    <properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties> <dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>17.0.1</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>17.0.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>17</source>
<target>17</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>

编写一个:resources/fxml/fxml_demo.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?> <AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="209.0"
prefWidth="250.0" xmlns="http://javafx.com/javafx/16" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="top.lingkang.FxmlController">
<children>
<Button fx:id="btn" layoutX="46.0" layoutY="51.0" mnemonicParsing="false" text="获取当前时间"/>
<TextField fx:id="text" layoutX="46.0" layoutY="86.0"/>
<Label fx:id="lab" layoutX="46.0" layoutY="129.0" text="Label"/>
</children>
</AnchorPane>

编写一个controller

import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField; import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.ResourceBundle; /**
* @author lingkang
* @date 2021/11/14
*/
public class FxmlController implements Initializable {
@FXML // 初始化时会自行绑定fxml里的id,注意变量命名=fxml里的id
private Button btn;
@FXML // 初始化时会自行绑定fxml里的id,注意变量命名=fxml里的id
private TextField text;
// 初始化时会自行绑定fxml里的id,注意变量命名=fxml里的id
public Label lab; @Override
public void initialize(URL url, ResourceBundle resourceBundle) {
// 添加初始化事件
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent actionEvent) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date = format.format(new Date());
// 将值赋予标签显示
text.setText(date);
lab.setText(date);
}
});
}
}

编写启动入口main

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage; import java.net.URL; /**
* @author lingkang
* @date 2021/11/14
*/
public class FxmlDemo extends Application {
@Override
public void start(Stage stage) throws Exception {
// 获取 Maven 项目 resources/fxml/fxml_demo.fxml 注意,无法识别横向,例如 fxml-demo.fxml
URL resource = getClass().getResource("/fxml/fxml_demo.fxml");
if (resource == null) {
throw new RuntimeException("未找到fxml资源");
}
// 此时需要注意, fxml里最外层标签是 AnchorPane 故使用AnchorPane对象获取变量
AnchorPane anchorPane = FXMLLoader.load(resource);
// 将 AnchorPane 加入到场景
stage.setScene(new Scene(anchorPane));
stage.setTitle("openjfx17~");
stage.show();
} public static void main(String[] args) {
launch(args);
}
}

run启动失败:

二、配置一个openjfx17

我们知道,javafx已经在jdk11还是9、10哪个版本来着,将此作为独立的GUI维护,并推荐使用OpenJFX。OpenJFX的下载地址:https://openjfx.cn/dl/我这里下载17.0.1zip版本。
将OpenJFX17解压到C:\Program Files\Java\javafx-sdk-17.0.1,
配置idea的application启动,添加启动vm参数,将模块引入:
--module-path "C:\Program Files\Java\javafx-sdk-17.0.1\lib" --add-modules javafx.controls,javafx.fxml

再运行一次:

三、将javafx项目打包jar

我们先将javafx项目打包成运行的jar,javafx11+独立出了GUI,打包jar有点特殊,需要将dll也打包!
先创建一个启动入口,打成的jar从这里启动,不能直接从编写的FxmlDemo.main启动!

package top.lingkang;

/**
* @author lingkang
* @date 2021/11/14
*/
public class App {
public static void main(String[] args) {
FxmlDemo.main(args);
}
}

一定要先创建一个普通main去运行javafx的main

idea中 File》Proiect Structure》Libraries
1、先删除maven的依赖:

2、将openjfx的依赖添加进来:

3、按照第2步,将openjfx的window运行的dll库添加进来:


设置构建jar

选择启动类,上面新编写的App类

将dll添加进来:+ File


然后点OK,然后构建jar

Build

构建后运行这个jar

至此,javafx打包jar完毕!接下来是打包exe

那个警告是因为没有配置模块化module-info.java,忽略他即可。
在java16以上可以模块化开发:module-info.java,用idea2021.2.x直接初始化javafx项目就自动生成这个src/main/java/module-info.java,内容大概如下:

module top.lingkang.demo {
requires javafx.controls;
requires javafx.fxml; opens top.lingkang.demo to javafx.fxml;
exports top.lingkang.demo;
}

四、packr打包exe

packr是可以多平台打包分发,所以我不算标题党,这里我只显示了win打包,因为家境贫寒Mac测试不了,你也可以寄一台Mac给我打包试试。
packr下载:https://github.com/libgdx/packr
下载好packr-all-4.0.0.jar
下载一个openjdk17,我在清华大学镜像站下载:https://mirrors.tuna.tsinghua.edu.cn/
Index of /AdoptOpenJDK/17/jdk/x64/windows/
将他们放一起

编写一个my-packr-config.json

{
"platform": "windows64",
"jdk": "./OpenJDK17U-jdk_x64_windows_hotspot_17.0.1_12.zip",
"executable": "javaFX-demo",
"classpath": [
"demo2.jar"
],
"mainclass": "top.lingkang.App",
"vmargs": [
"Xms32m","Xmx512m"
],
"minimizejre": "soft",
"output": "out-windows64"
}

若出现中文乱码可考虑在json的vmargs中添加"Dfile.encoding=utf-8"

cmd执行构建,

java -jar packr-all-4.0.0.jar my-packr-config.json
# 或者
java -jar -Dfile.encoding=utf-8 packr-all-4.0.0.jar my-packr-config.json

等待完成!

运行exe

没设置图标,嘿嘿!

压缩后大小有200多MB,如果选用java11的话估计在100MB以内,这里我提供一些大小压缩思路,例如将openjfx的dll直接放到openjdk17中,将减少jar的打包大小,当然啦,也有可能是packr-all-4.0.0.jar未支持jdk17,所有将整个openjdk17的jre放进去了,未实现删减!!那我们只能等等党,或者降低jdk版本啦!

若运行exe无任何事情发生,可以cmd运行 xxx.exe查看控制台输出的错误,根据错误解决。

上面的错误就是jar打包后无法识别resources的资源,可以考虑独立拿出fxml,调用时调用当前目录下的fxml/xxx.fxml。。或者使用压缩软件打开jar,调整目录位置。个人更推荐加载外部资源。。

五、一件三连

创作不易,写文章也花长时间,你觉得对你有帮助请给我点个赞!一健三连…谢谢啦!
创作不易,写文章也花长时间,你觉得对你有帮助请给我点个赞!一健三连…谢谢啦!
创作不易,写文章也花长时间,你觉得对你有帮助请给我点个赞!一健三连…谢谢啦!
你的点赞就是我的动力
你的点赞就是我的动力
你的点赞就是我的动力

JavaFX打包exe+Wind+Mac+Linux多平台分发等等的更多相关文章

  1. BesLyric 全新版本下载 ( windows \ mac \ linux )

    导读 BesLyric , 一款专门制作 网易云音乐 LRC 滚动歌词的软件! 搜索.下载.制作 歌词更方便! 很荣幸地,自 beslyric 2017 年开发推出以来,得到了很多云村村民的肯定,现在 ...

  2. Linux同平台数据库整体物理迁移

    Linux同平台数据库整体物理迁移 需求:A机器不再使用,要将A机器的Oracle迁移到B机器. 之前写过类似需求的文章:http://www.cnblogs.com/jyzhao/p/3968504 ...

  3. 在Mac/Linux/Windows上编译corefx遇到的问题及解决方法

    这两天尝试在Mac/Linux/Windows三大平台上编译.NET跨平台三驾马车(coreclr/corefx/dnx)之一的corefx(.NET Core Framework),结果三个平台的编 ...

  4. Sublime Text 2 - 性感无比的代码编辑器!程序员必备神器!跨平台支持Win/Mac/Linux

    我用过的编辑器不少,真不少- 但却没有哪款让我特别心仪的,直到我遇到了 Sublime Text 2 !如果说“神器”是我能给予一款软件最高的评价,那么我很乐意为它封上这么一个称号.它小巧绿色且速度非 ...

  5. OpenGL环境搭建Windows+Mac+Linux

    OpenGL环境搭建Windows+Mac+Linux Mac平台下 下载列表:GLFWcmake 下载的GLFW解压缩 然后安装cmake, 安装好cmake之后打开 1.browse source ...

  6. [转载]Sublime Text 2 - 性感无比的代码编辑器!程序员必备神器!跨平台支持Win/Mac/Linux

    代码编辑器或者文本编辑器,对于程序员来说,就像剑与战士一样,谁都想拥有一把可以随心驾驭且锋利无比的宝剑,而每一位程序员,同样会去追求最适合自己的强大.灵活的编辑器,相信你和我一样,都不会例外. 我用过 ...

  7. Linux同平台Oracle数据库整体物理迁移

    Linux同平台数据库整体物理迁移需求:A机器不再使用,要将A机器的Oracle迁移到B机器.之前写过类似需求的文章: http://www.linuxidc.com/Linux/2015-05/11 ...

  8. [破解]java打包Exe工具 - Jar2Exe Wizard

    打包java文件为exe的方法和软件有很多,还有一些开源的软件和一些免费的软件. 我用过的所有打包exe软件中,Jar2Exe Wizard是最好用的,但是只有一个月的试用期,需要的可以从官网下载. ...

  9. JavaFX打包到Android上

    让JavaFX执行到移动平台一直是社区努力完毕的事.  当然,眼下已经能够让JavaFX执行到Android和IOS平台了,以下我们来看看怎样打包自己的JavaFX项目到Android平台.  首先下 ...

  10. NVM 安装(window/mac/linux)

    一.window版 1.nvm-windows下载 [下载地址](https://github.com/coreybutler/nvm-windows/releases),下载 nvm-setup.z ...

随机推荐

  1. 前端框架——Vue3

    文章目录 Vue3快速上手 1.Vue3简介 2.Vue3带来了什么 1.性能的提升 2.源码的升级 3.拥抱TypeScript 4.新的特性 一.创建Vue3.0工程 1.使用 vue-cli 创 ...

  2. 8. 用Rust手把手编写一个wmproxy(代理,内网穿透等), HTTP改造篇之HPACK原理

    用Rust手把手编写一个wmproxy(代理,内网穿透等), HTTP改造篇之HPACK原理 项目 ++wmproxy++ gite: https://gitee.com/tickbh/wmproxy ...

  3. 概率期望 DP 题解合集

    期望这东西学了一次忘了,再学一次过了两天又不会了.我是鱼. 故写此博客以便加深记忆及日后复习. NOIP 前恶补期望(? 希望有用,RP++() 经典问题 1 某事件发生概率为 \(p\),则该事件首 ...

  4. 舞会(lgP1352)

    写了一个多小时,本来觉得 bfs 能过然后码了好久发现不会确定顺序,又重新写了一遍 dfs /kk 好吧其实是因为我记得上次做这题的时候写的是 bfs 设 \(f[i][0]\) 表示以 \(i\) ...

  5. Production Environment Difference Between Development, Stage, And Production

    There are three different environments that you'll probably deal with at some point. Each environmen ...

  6. Lazyload 延迟加载效果(转)

    http://www.cnblogs.com/cloudgamer/archive/2010/02/01/LazyLoad.html Lazyload是通过延迟加载来实现按需加载,达到节省资源,加快浏 ...

  7. 树莓派4b部署samba服务实现文件共享

    注意 samba 生命力很旺盛,软件是在不断更新的, 网上很多针对 samba 网速优化设置截止当前 实测发现有很多已经过期, 甚至有些设置会适得其反,使传输速度更低. 例如, 全网都在配置的参数,& ...

  8. 开发现代化的.NetCore控制台程序:(4)使用GithubAction自动构建以及发布nuget包

    前言 上一篇文章介绍了将 nuget 包发布到 Github Packages 上. 本文更进一步,使用 GitHub Action 搭建 CI/CD 流水线,进行 nuget 的自动构建和发布. G ...

  9. CoreFX中Dictionary<TKey, TValue>的源码解读

    无论是实际的项目中,还是在我们学习的过程中,都会重点的应用到Dictionary<TKey, TValue>这个存储类型.每次对Dictionary<TKey, TValue> ...

  10. markdown文字与图片对齐方式

    markdown文字与图片对齐方式 一.图片文字左右对齐 //如图所示,左文字,右图片 <div align="center"> <table rules=&qu ...