jar包转exe封装软件并一键安装使用

目录

        • 封装文档说明
        • 如有跨域问题在ems服务增加配置
        • 服务启动自动打开浏览器
        • 使用工具 Launch4j 把jar包打成exe执行文件
        • 现在还不能给用户用,因为缺少jre,后面整合资源会把jre一起打包
        • 使用inno setup合并资源,mysql之类的服务,最终打包成exe安装包

封装文档说明

主要封装的作用:简化用户的操作,一键安装,直接使用,无需多余配置

直接把安装包甩给用户,用户开箱即用!!!

前端访问后端url设为http://localhost:1060/api/

后端mysql连接设为localhost 用户名root,密码tecloman

SpringBoot使用内置tomcat启动vue

前端dist打包后的文件夹放到/resource/static目录下

image

后端配置增加

    spring:web:resources:static-locations: classpath:/static/
如有跨域问题在ems服务增加配置
    import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.cors.CorsConfiguration;import org.springframework.web.cors.UrlBasedCorsConfigurationSource;import org.springframework.web.filter.CorsFilter;@Configurationpublic class CorsConfig {@Beanpublic CorsFilter corsFilter() {CorsConfiguration config = new CorsConfiguration();config.setAllowCredentials(true); // 如果需要携带cookie,设为trueconfig.addAllowedMethod("*"); // 允许所有HTTP方法config.addAllowedHeader("*"); // 允许所有请求头// 显式列出允许的源或者使用allowedOriginPatterns// 允许来自localhost:1060的请求config.addAllowedOrigin("http://localhost:1060");// 或者使用allowedOriginPatterns// config.setAllowedOriginPatterns(Arrays.asList("http://*.yourdomain.com"));UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**", config); // 对所有路径应用CORS配置return new CorsFilter(source);}}
服务启动自动打开浏览器
    import lombok.extern.slf4j.Slf4j;import org.springframework.boot.CommandLineRunner;import org.springframework.stereotype.Component;import java.io.IOException;@Slf4j@Componentpublic class StartupRunner implements CommandLineRunner {@Overridepublic void run(String... args) {// 服务启动打开浏览器openBrowser("http://localhost:1060/hss_web/index.html");}private void openBrowser(String url) {String os = System.getProperty("os.name").toLowerCase();try {if (os.contains("win")) {Runtime.getRuntime().exec("cmd /c start " + url);} else if (os.contains("mac") || os.contains("darwin")) {Runtime.getRuntime().exec("open " + url);}} catch (IOException e) {System.err.println("Failed to open browser: " + e.getMessage());}}}
使用工具 Launch4j 把jar包打成exe执行文件

服务打成jar包

下载封装程序相关软件.zip,解压后如下

image

将ems服务jar包放到解析目录,改名为ems.jar

打开Launch4j文件夹下的launch4j.exe,并打开配置文件,ems.xml

image

界面如下,只要jar包放在解压目录则不用更改

image

唯一需要改的地方,更改启动配置文件

image

最后点击齿轮保存文件并生成exe文件,就会像图1一样多了ems.exe文件,本机可直接启动,

现在还不能给用户用,因为缺少jre,后面整合资源会把jre一起打包

image

使用inno setup合并资源,mysql之类的服务,最终打包成exe安装包

安装合并工具Inno Setup v6.0.4 汉化版,在解压目录下

打开innosetup 再打开封装脚本文件.iss,如下图

image```yaml

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!#define MyAppName "EmsApp"
#define MyAppVersion "1.5"
#define MyAppPublisher "tecloman"
#define MyAppURL "https://www.tecloman.com/"
#define MyAppExeName "ems.exe"[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{FC10B53B-96FE-4703-AFD3-10E414E9EE47}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DisableProgramGroupPage=yes
OutputDir=C:\Users\Administrator\Desktop
OutputBaseFilename=emsSetup
;SetupIconFile=C:\Users\Administrator\Desktop\add\jdk1.8-windows-x64_00001.ico
Compression=lzma
SolidCompression=yes[Languages]
Name: "English"; MessagesFile: "compiler:Default.isl"[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
[Files]
Source: "C:\Users\Administrator\Desktop\add\ems.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Administrator\Desktop\add\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
[Icons]
Name: "{commonprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
[Setup]
PrivilegesRequired=admin
SetupLogging=yes[INI]
;修改数据库配置文件
Filename:"{app}\mysql\my.ini";Section:"mysqld";Key:"basedir"; String:"{app}\mysql";
Filename:"{app}\mysql\my.ini";Section:"mysqld";Key:"datadir"; String:"{app}\mysql\data";
[Code]
[Run]
;Filename: "notepad.exe"; Parameters: "{app}\mysql\my.ini"; StatusMsg: "正在检查my.ini配置文件...请确认修改后关闭Notepad以继续安装。"; Flags: waituntilterminated ;Filename: "{app}\mysql.bat"; Description: "正在执行启动脚本..."; Flags: runhidden           mysqld --initialize --console
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
Filename: "{app}\mysql.bat"; Description: "正在执行MySQL服务安装和启动脚本..."; Flags: shellexec[UninstallRun]
; 停止MySQL服务
Filename: "net"; Parameters: "stop MySQLService"; StatusMsg: "正在停止MySQL服务..."; Flags: runhidden waituntilterminated
; 卸载MySQL服务
Filename: "{app}\mysql\bin\mysqld.exe"; Parameters: "--remove MySQLService"; WorkingDir: "{app}\mysql\bin"; StatusMsg: "正在卸载MySQL服务..."; Flags: runhidden waituntilterminated

资源路径下的mysql,我是初始化过的,设置过密码 root tecloman,所以安装完成后只需要注册服务并启动就可以了,这由mysql.bat做处理,我们需要提前把EMS相关的数据库提前建立好,所以在资源路径下的mysql\data目录下就得先弄好,最后生成安装包,用户解压即可使用

    # 初始化,密码会显示在控制台 最后一行mysqld --initialize --console# 注册服务mysqld --install MysqlService --defaults-file="C:\Users\Administrator\Desktop\add\mysql\my.ini"# 启动服务net start MysqlService# 登陆mysql -uroot -pHj6u5Kp.)ti9# 修改密码ALTER USER 'root'@'localhost' IDENTIFIED BY 'tecloman';# 刷新权限 FLUSH PRIVILEGES;

image

如果注册服务失败,肯定是配置文件有问题,注册成功后会在/mysql目录生成data目录,data目录主要存放ems相关的数据库数据

连接数据库把ems相关的数据拷贝到当前mysql就可以了,mysql就可以放到资源目录下,把刚创建的mysql服务停止移除,sc delete MySqlService 否则打包程序运行不了

资源目录详情

image

jre是运行jar必备的,

mysql就是刚初始化过的,不要直接把未初始化过的放过来,因为mysql初始化是不能手动设置密码的,

mysql.bat是安装后运行的批处理文件,如下,安装包会自动执行

set “CURRENT_DIR=%~dp0” 这代表当前目录的变量(安装目录)

    setlocal enabledelayedexpansionset "CURRENT_DIR=%~dp0"@echo 注册服务"%CURRENT_DIR%mysql\bin\mysqld.exe" --install MySQLService --defaults-file="%CURRENT_DIR%mysql\my.ini"@echo 启动服务net start MySQLServicepause

编译

image

会在输出目录生成一个exe安装文件

innosetup语法大全

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

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

相关文章

数字化转型下的企业人力资源信息系统研究

随着数字化转型的加速,企业人力资源管理面临着全新的挑战和机遇。传统的人力资源信息系统(HRIS)在新时代的要求下必须进行深刻的革新和升级,以更好地支持企业的发展战略和员工的需求。 数据驱动的决策支持 在当今这个信息化迅猛发…

【系统架构设计师】四、嵌入式基础知识(软件|软件设计|硬件|式总线逻辑)

目录 一、嵌入式软件 1.1 嵌入式软件分类 1.2 板级支持包(BSP) 1.3 BootLoader 1.4 设备驱动程序 二、嵌入式软件设计 2.1 编码 2.2 交叉编译 2.3 交叉调试 三、嵌入式系统硬件的分类 3.1 根据用途分类 3.2 存储器分类 四、内(外)总线逻辑 …

uni-app系列:uni.navigateTo传值跳转

文章目录 1. 使用URL参数2. 使用页面栈注意事项:uni.navigateTo API 参数详细说明回调函数参数 在uni-app中,如果想要通过uni.navigateTo方法跳转到另一个页面并传递参数,可以使用页面路由的URL参数或者页面栈的方式来传递。但是,…

分享一个解决 EF 性能低的思路,通过 Python 访问心跳侦测 API 保持 EF 在线

前言 .NET FrameWork EF(Entity Framework)是一个很优秀的 ORM 框架,对于提高工作效率很有帮助,但由于底层原因,在程序启动时,EF 需要初始化和加载模型及其对应的数据库元数据等等,涉及到数据库…

20240507-招商证券 基于鳄鱼线的指数择时及轮动策略

动量震荡指标构造 动量震荡指标为交易者提供了获利的钥匙。动量震荡指标测算了5根价格柱相对于34根价格柱的动量变化。首先计算最近5根价格柱的最高价和最低价间的中点的简单移动平均值,即(最高价最低价)12的简单移动平均,将得出的值减去最近34根价格柱…

urfread学Linux|基本操作

切换界面 如何在VMware切换到命令行界面、切回图形化界面、释放鼠标和键盘 使用ctrlalt可以释放虚拟机对鼠标键盘的控制——就是你可以按这个键切出来到windows 使用ctrlaltF1可以切到图形化界面 使用ctrlaltF2可以切到命令行界面 文件夹相关操作 创建:mkdir文件…

Odoo OWL组件简介

Odoo OWL是Odoo框架中的一个前端开发工具,它被设计用来创建高效、可维护的用户界面组件。OWL利用现代JavaScript的特性,如组件、钩子(Hooks)和虚拟DOM,来提高开发效率和用户体验。OWL组件是构建Odoo前端的基础&#xf…

Cephalo:专门用于仿生设计的多模态视觉大型语言模型

实时了解业内动态,论文是最好的桥梁,专栏精选论文重点解读热点论文,围绕着行业实践和工程量产。若在某个环节出现卡点,可以回到大模型必备腔调或者LLM背后的基础模型重新阅读。而最新科技(Mamba,xLSTM,KAN)…

linux库函数 gettimeofday() localtime 使用demo

1. 基本说明 /* linux库函数 gettimeofday 1. 头文件#include <sys/time.h> 2. 函数形式int gettimeofday(struct timeval *tv, struct timezone *tz); 3. 返回值Returns 0 on success, or –1 on error 4. 参数tv&#xff1a;虽然tv_usec字段提供微秒级精度&#xff0…

代码随想录训练营第十七天 654最大二叉树 617合并二叉树 700二叉树搜索树的搜索

第一题&#xff1a; 原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 先找到这个数组中的最大值的下标。 然后将数组分为左右两个区间。 然后进行递归。 /*** Definition for a binary tree node.* struct TreeNode {* int val;* …

审美进阶:7个小程序模板,助你提高设计感!

小程序是一种无需下载和安装即可使用的应用程序。小程序实现了应用程序“触手可及”的梦想。用户可以通过扫描或搜索打开应用程序。对于开发者来说&#xff0c;小程序也大大降低了开发成本。因此&#xff0c;越来越多的品牌争相制作小程序应用程序。本文将为您带来优秀的微信小…

安卓开发,获取本机手机号

用免费云服务器&#xff0c;三丰云记录安卓开发过程 以下是使用 Android 开发获取本机手机号的示例代码&#xff08;需要相关权限&#xff09;&#xff1a; java 复制 import android.content.Context; import android.content.pm.PackageManager; import android.os.Build; i…

ubuntu安装qtcreator与环境配置

sudo apt-get update sudo apt-get install gcc g # 两个编译器 sudo apt-get install build-essential # 编译c/c所需要的软件包 sudo apt-get install libgl1-mesa-dev # 安装mesa&#xff0c;Mesa 实际上是一个库&#xff0c;它实现了多种图形 API 规范 sudo apt-get insta…

[pycrypto][python]pycrypto所有whl文件下载地址汇总

PyCrypto是一个强大的Python加密库&#xff0c;专为密码学和数据安全提供了一系列工具。以下是关于PyCrypto的详细介绍&#xff1a; 项目简介&#xff1a; PyCrypto是一个广泛使用的开源Python库&#xff0c;它包含了多种经典和现代的加密算法&#xff0c;如AES&#xff08;高级…

IOPaint前后端框架

IOPaint 前后端框架 IOPaint 是一个图像修复工具&#xff0c;使用了先进的AI模型进行图像编辑。以下是其前后端所使用的框架&#xff1a; 前端框架 IOPaint 的前端使用了 Node.js 和 npm 进行依赖管理和构建。具体步骤如下&#xff1a; 克隆仓库并进入 web_app 目录&#x…

微信小程序设置时间缓存限制,一段时间后自动清除缓存内容

在原生微信小程序的 app.js 文件里的 onShow (生命周期回调-监听小程序启动或切前台)进行设置 在 uni-app 的 App.vue 文件里的 onShow (生命周期回调-监听小程序启动或切前台)进行设置 onShow() {// 存入初次打开小程序的时间&#xff0c;为后面清除缓存使用const dataExpir…

MFC结构体定义中使用CString类型

MFC的结构体定义中字符串可以使用CString类型&#xff1b; struct MyStruct {int x;int y;CString str; }; ...... void CTttView::OnDraw(CDC* pDC) {CTttDoc* pDoc GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCString str1;MyStruct m_…

React 组件通信-案例

React 组件通信是构建复杂应用的核心部分&#xff0c;涉及到不同组件之间的数据传递和事件处理。以下提供了相应的案例代码。 1. 父组件向子组件传递数据&#xff08;父传子&#xff09; 父组件通过 props 向子组件传递数据。 // ParentComponent.js import React from reac…

Android中的导航navigation的使用方式

在 Android 中&#xff0c;导航&#xff08;Navigation&#xff09;组件是一种用于管理应用内导航和屏幕之间关系的框架&#xff0c;它可以帮助你以一种更一致和结构化的方式管理应用的各个页面或片段&#xff08;Fragments&#xff09;之间的跳转和导航。下面是使用导航组件的…

vue配置中的process.env

项目中的.env开头的文件是否知道是干什么的呢 主要是为了区分测试环境还是生产环境env.development为测试环境 # 测试环境 NODE_ENV development VUE_APP_BASE_API http://xxxxxxxxx // 命名一定要以 VUE_APP_ 开头&#xff0c;要不然根本取不到 .env.production为生产环境…