《SpringBoot、Vue 组装exe与套壳保姆级教学》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗

🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数,欢迎多多交流。👍

文章目录

写在前面的话

近期,收到一位朋友求助,其客户要求他提供一套PC端的全景图程序。由于他是一名纯正的 Java 程序猿,Vue 也会一些,使用博主的万能模板(SpringBoot+Vue),三下五除二就搞定了程序开发工作。

但是,客户验收提了一个要求,该程序要是离线版的,而且要安装在客户自己电脑上,打开不能用浏览器,要有安装文件,安装完是有一个入口 exe,并且一个壳套着,还给了参考系统如下图。

这可把我朋友愁的,Java 还能做这些?于是乎,本文开始了。


需求分析

前文提到,我朋友是一个老实本分的 Java 开发,会 SpringBoot,会一点点的 Vue,仅此而已,这些需求也不会啊。

但需求还是要做,不然尾款拿不到了。

于是找到我。

这边帮忙分析了一下需求,先拆分一下需求:

1、需要exe;

2、需要安装包;

3、需要套壳;

那就一个个来吧,兵来将挡,水来土掩。


组装 exe 分析

首先,将 Spring Boot JAR 文件打包为 EXE 文件的常用方式有以下几种:

1、Launch4j:是一个开源工具,可以将 JAR 文件包装成 Windows 可执行文件(EXE)。它支持设置图标、JRE 路径等配置。

2、JSmooth:是一个开源工具,可以将 JAR 文件转换为 EXE 文件。它允许你配置 JRE 的查找方式和其他参数。

3、Exe4j:部分功能商用,可以将 JAR 文件转换为 EXE 文件,提供更多的配置选项和功能。

4、还有很多,未完待续。。

这里由于篇幅所限,不继续展开了。

基本都能实现功能,尝试几款后,发现Exe4j挺方便的,也能满足需求,就用这套不纠结,条条道路通罗马。


使用 Exe4j 组装 exe

Exe4j 操作很简单,先明确一下输入和输出,就是你想要将什么弄成什么?

对于 SpringBoot 项目,我们要先打包一个 jar 文件,然后通过 Exe4j 的加工,拿到一个 exe。

软件操作基本傻瓜式的,重要截图如下:

最终操作完成后,你就拿到了一个xxx.exe,双击打开的效果和 cmd java -jar 效果差不多。

搞定收工!对了,这里前端可以直接静态文件编译完,放到 SpringBoot 一起部署,没什么问题。当然,前端其实也支持单独打exe,后面会介绍到。


生成安装包分析

按前面步骤,单独生成exe了,但是就这样exe丢出去,太不高大上了。

所以客户要求需要用安装包的形式安装,才可以逼格拉满。

当然,这里其实也有另外一个问题。单独的exe,丢到任意用户的电脑,它们可都没有JDK环境,能用就有鬼了。

这里我们就一起考虑吧。暂定采用<font style="color:rgb(51, 51, 51);">Inno setup</font>进行安装包生成。


使用 Inno setup 生成安装包

Inno setup 操作也很简单,也明确一下输入和输出,就是你想要将什么弄成什么?

我们有了一个 exe,需要输出一个安装包文件,当然还要包裹 JDK 环境。

如下所示,这个是输入信息。

软件操作基本傻瓜式的,重要截图如下:

部分步骤由于都是跳过,就省略了,上图这边是要注意的,需要选择"否",因为我们还需要添加JRE相关脚本,然后再自行编译。

添加下面两句即可,然后手动点击执行,等待一段时间,就可以拿到安装包了。

latex 复制代码
#define MyJreName "jre"

[Files]
Source: "D:\exe-export\jre1.8.0_144\*"; DestDir: "{app}\{#MyJreName}"; Flags: ignoreversion recursesubdirs createallsubdirs

套壳分析与实现

按上述步骤,可以得到安装包,但是安装后,得到的仍然是exe,打开之后用户还是要使用谷歌访问页面,太不方便了。

客户还是要求套壳、套壳、套壳!

没办法,Java做套壳没接触过,找到一个c#兄弟,说明了一下情况。

确实三下五除二搞了一个外壳,内嵌浏览器,可以嵌套访问我们的网站了。

果然是隔行如隔山!

但是,问题到这边还没结束,这样做又涉及需要将C#壳程序、Java可执行程序打包到一起的情况,那用户需要安装后,需要先启动Java服务,再打开壳程序,较为麻烦。

因此,我们这边继续优化了一下,SpringBoot启动成功后,继续触发同目录下的c#壳程序,也支持外部yml配置路径的方式。

最终满足了客户要求,搞定收工!

java 复制代码
@Component
public class OpenBrowser implements CommandLineRunner {

    @Value("${app.exePath:}")
    private String exePathYml;

    @Override
    public void run(String... args) throws Exception {
        try {
            String exePath = "";
            if(!StringUtils.isEmpty(exePathYml)){
                exePath = exePathYml;
            } else {
                String currentDir = System.getProperty("user.dir");
                exePath = currentDir + File.separator + "Tools.exe";
            }
            Runtime.getRuntime().exec(exePath);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

补充:Vue项目打包 exe

验证期间也尝试过,直接将Vue打包为exe文件,这边顺便记录一下这一过程。

采用的是electron插件实现, 可以直接参考官方示例:electron-quick-start

大致步骤:

Step1、安装electron依赖;

Step2、在main.js利用,比如设置窗体、菜单等;

Step3、修改package.json脚本,添加electron-packager命令;

Step4、触发命令,生成可执行文件exe;

由于这里不是Vue打包专栏,就不详细展开了。通常也比较少将前端单独部署成exe的,和后端一起打包的情况更常见。


总结陈词

💗 本篇文章介绍了策略模式的实战应用,希望可以帮助到大家。

💗 后续会逐步分享企业实际开发中的实战经验,有需要交流的可以联系博主。

相关推荐
小旋风012342 分钟前
封装可拖动弹窗(vue jquery引入到html的版本)
vue.js·html·jquery
gongzemin36 分钟前
React 和 Vue3 在事件传递的区别
前端·vue.js·react.js
Apifox1 小时前
如何在 Apifox 中通过 Runner 运行包含云端数据库连接配置的测试场景
前端·后端·ci/cd
uhakadotcom1 小时前
使用 Model Context Protocol (MCP) 构建 GitHub PR 审查服务器
后端·面试·github
Asthenia04121 小时前
详细分析:ConcurrentLinkedQueue
后端
麦麦大数据1 小时前
neo4j+django+deepseek知识图谱学习系统对接前后端分离前端vue
vue.js·django·知识图谱·neo4j·deepseek·在线学习系统
uhakadotcom1 小时前
Ruff:Python 代码分析工具的新选择
后端·面试·github
uhakadotcom1 小时前
Mypy入门:Python静态类型检查工具
后端·面试·github
喵个咪1 小时前
开箱即用的GO后台管理系统 Kratos Admin - 定时任务
后端·微服务·消息队列
Asthenia04121 小时前
ArrayList与LinkedList源码分析及面试应对策略
后端