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

news2024/12/29 8:31:17

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

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

文章目录

    • 写在前面的话
    • 需求分析
    • 组装 exe 分析
    • 使用 Exe4j 组装 exe
    • 生成安装包分析
    • 使用 Inno setup 生成安装包
    • 套壳分析与实现
    • 补充:Vue项目打包 exe
    • 总结陈词

写在前面的话

近期,收到一位朋友求助,其客户要求他提供一套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相关脚本,然后再自行编译。

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

#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配置路径的方式。

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

@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的,和后端一起打包的情况更常见。


总结陈词

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2245583.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flowable第一篇、快速上手(Flowable安装、配置、集成)

目录 Flowable 概述Flowable的安装与配置 2.1. FlowableUI安装 2.2. Flowable BPMN插件下载 2.3 集成Spring Boot流程审核操作 3.3 简单流程部署 3.4 启动流程实例 3.5 流程审批 一、Flowable 概述 Flowable是一个轻量级、高效可扩展的工作流和业务流程管理&#xff08;BPM&…

Docker搭建有UI的私有镜像仓库

Docker搭建有UI的私有镜像仓库 一、使用这个docker-compose.yml文件&#xff1a; version: 3services:registry-ui:image: joxit/docker-registry-ui:2.5.7-debianrestart: alwaysports:- 81:80environment:- SINGLE_REGISTRYtrue- REGISTRY_TITLEAtt Docker Registry UI- DE…

容器安全检测和渗透测试工具

《Java代码审计》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484219&idx1&sn73564e316a4c9794019f15dd6b3ba9f6&chksmc0e47a67f793f371e9f6a4fbc06e7929cb1480b7320fae34c32563307df3a28aca49d1a4addd&scene21#wechat_redirect Docker-bench-…

Day10_CSS过度动画

Day10_CSS过度动画 背景 : PC和APP项目我们已经开发完毕, 但是再真正开发的时候有些有些简易的动态效果我们可以使用CSS完成 ; 本节课我们来使用CSS完成基础的动画效果 今日学习目标 CSS3过度CSS3平面动态效果CSS3动画效果案例 1. CSS3过渡 ​ 含义 :过渡指的是元素从一种…

iOS应用网络安全之HTTPS

移动互联网开发中iOS应用的网络安全问题往往被大部分开发者忽略, iOS9和OS X 10.11开始Apple也默认提高了安全配置和要求. 本文以iOS平台App开发中对后台数据接口的安全通信进行解析和加固方法的分析. 1. HTTPS/SSL的基本原理 安全套接字层 (Secure Socket Layer, SSL) 是用来…

excel版数独游戏(已完成)

前段时间一个朋友帮那小孩解数独游戏&#xff0c;让我帮解&#xff0c;我看他用电子表格做&#xff0c;只能显示&#xff0c;不能显示重复&#xff0c;也没有协助解题功能&#xff0c;于是我说帮你做个电子表格版的“解题助手”吧&#xff0c;不能直接解题&#xff0c;但该有的…

金融数据中心容灾“大咖说” | 美创科技赋能“灾备一体化”建设

中国人民银行发布的《金融数据中心容灾建设指引》&#xff08;JR/T 0264—2024&#xff09;已于2024年7月29日正式实施。这一金融行业标准对金融数据中心容灾建设中的“组织保障、需求分析、体系规划、建设要求、运维管理”进行了规范和指导。面对不断增加的各类网络、业务、应…

Qt:信号槽

一. 信号槽概念 信号槽 是 Qt 框架中一种用于对象间通信的机制 。它通过让一个对象发出信号&#xff0c;另一个对象连接到这个信号的槽上来实现通信。信号槽机制是 Qt 的核心特性之一&#xff0c;提供了一种灵活且类型安全的方式来处理事件和数据传递。 1. 信号的本质 QT中&a…

SpringBoot与MongoDB深度整合及应用案例

SpringBoot与MongoDB深度整合及应用案例 在当今快速发展的软件开发领域&#xff0c;NoSQL数据库因其灵活性和可扩展性而变得越来越流行。MongoDB&#xff0c;作为一款领先的NoSQL数据库&#xff0c;以其文档导向的存储模型和强大的查询能力脱颖而出。本文将为您提供一个全方位…

大数据调度组件之Apache DolphinScheduler

Apache DolphinScheduler 是一个分布式易扩展的可视化 DAG 工作流任务调度系统。致力于解决数据处理流程中错综复杂的依赖关系&#xff0c;使调度系统在数据处理流程中开箱即用。 主要特性 易于部署&#xff0c;提供四种部署方式&#xff0c;包括Standalone、Cluster、Docker和…

ThinkPHP6门面(Facade)

门面 门面&#xff08;Facade&#xff09; 门面为容器中的&#xff08;动态&#xff09;类提供了一个静态调用接口&#xff0c;相比于传统的静态方法调用&#xff0c; 带来了更好的可测试性和扩展性&#xff0c;你可以为任何的非静态类库定义一个facade类。 系统已经为大部分…

MySQL win安装 和 pymysql使用示例

目录 一、MySQL安装 下载压缩包&#xff1a; 编写配置文件&#xff1a; 配置环境变量&#xff1a; 初始化服务和账户 关闭mysql开机自启&#xff08;可选&#xff09; 建议找一个数据库可视化软件 二、使用pymysql操作数据库 安装pymysql 示例代码 报错处理 一、My…

Parker派克防爆电机在实际应用中的安全性能如何保证?

Parker防爆电机确保在实际应用中的安全性能主要通过以下几个方面来保证&#xff1a; 1.防爆外壳设计&#xff1a;EX系列电机采用强大的防爆外壳&#xff0c;设计遵循严格的防爆标准&#xff0c;能够承受内部可能发生的爆炸而不破损&#xff0c;利用间隙切断原理&#xff0c;防…

空间与单细胞转录组学的整合定位肾损伤中上皮细胞与免疫细胞的相互作用

result 在空间转录组图谱中对人类肾脏进行无监督映射和细胞类型鉴定 我们试图在H&E染色的人类参考肾切除标本组织切片上直接映射转录组特征。该组织来自一名59岁的女性&#xff0c;其肾小球闭塞和间质纤维化程度最低&#xff08;分别影响不到10%的肾小球或肾实质&#xff…

greater<>() 、less<>()及运算符 < 重载在排序和堆中的使用

简略图 greater<>()(a, b) a > b 返回true&#xff0c;反之返回false less<>()(a, b) a < b 返回true&#xff0c;反之返回false 在cmp中使用&#xff08;正着理解&#xff09; 规则返回true时a在前&#xff0c;反之b在前 在priority_queue中使用 &#xff…

详细描述一下Elasticsearch索引文档的过程?

大家好&#xff0c;我是锋哥。今天分享关于【详细描述一下Elasticsearch索引文档的过程&#xff1f;】面试题。希望对大家有帮助&#xff1b; 详细描述一下Elasticsearch索引文档的过程&#xff1f; Elasticsearch的索引文档过程是其核心功能之一&#xff0c;涉及将数据存储到…

入门车载以太网(6) -- XCP on Ethernet

目录 1.寻址方式 2.数据帧格式 3.特殊指令 4.使用实例 了解了SOME/IP之后&#xff0c;继续来看看车载以太网在汽车标定领域的应用。 在汽车标定领域XCP是非常重要的协议&#xff0c;咱们先来回顾下基础概念。 XCP全称Universal Measurement and Calibration Protocol&a…

Python中常用的函数介绍

Python中常用的几种函数 1、input函数 input()函数&#xff1a;主要作用是让用户输入某个内容并接收它。 #输入你的年龄 >>> age input("my age is :") my age is :20 执行代码后输入年龄&#xff0c;年龄被存放到age变量中&#xff0c;执行print后终端会…

Ubuntu从入门到精通(二)远程和镜像源配置齐全

Ubuntu从入门到精通(二) 1 常见操作配置 1.1 英文语言配置 1.1.1 打开设置 1.1.2 设置语言为英文 1.1.3 重启生效 1.1.4 再次进入,选择更新名字 1.1.5 再次进入,发现已经变成了英文 1.2 输入法配置 1.3 rustdesk安装 1.3.1 Windows系统配置 登陆:https://github.com…

卷积神经网络(CNN)中的池化层(Pooling Layer)

池化层&#xff08;Pooling Layer&#xff09;&#xff0c;也被称为下采样层&#xff0c;是深度学习神经网络中常用的一种层级结构。它通常紧跟在卷积层之后&#xff0c;对卷积层输出的特征图进行下采样操作。 一、定义与功能 池化层的主要作用是通过减少特征图的尺寸来降低计算…