首页 > 数据库 >inno Setup 打包Java exe可执行文件和MySQL数据库,无需额外配置实现一键傻瓜式安装

inno Setup 打包Java exe可执行文件和MySQL数据库,无需额外配置实现一键傻瓜式安装

时间:2024-05-13 15:18:56浏览次数:31  
标签:exe Java -- uac% 傻瓜式 echo mysql MySQL app

前言

出现有需要打包 Java 应用和 Mysql数据库成一个安装包给出去的需求,这里我把整个打包的流程整理一下。

环境

JDK17;

MySQL 5.7;

流程

Jpackage打包EXE

Jpackage是JDK14后加入的一个用于独立打包的工具,能够将应用打包成exe,有了Jpackage就不需要用exe4j这种打包工具,省去打包的繁琐流程。

首先在idea里面打好Jar包,记下jar包的名字,比如是application.jar。打完后Jar包的目录一般是在target文件夹下,进到项目的目录,在上方的输入栏里输入打包命令,回车。

image-20240513141900866

打包命令:

jpackage --type app-image --name application --input target --main-jar application.jar --win-console --dest dist

打包完成后可以在dist文件夹里面看到对应的项目,双击exe就可以运行起项目。

jpackage命令详情:

  • --type:指定要创建的安装程序的类型,如 exemsi(仅限 Windows)、pkg(仅限 macOS)、debrpm 等。
  • --input <path>:指定要打包的输入文件或目录的路径。
  • --dest <path>:指定生成安装程序的目标目录。
  • --name <name>:指定应用程序的名称。
  • --app-version <version>:指定应用程序的版本号。
  • --main-jar <jar>:指定应用程序的主 JAR 文件。
  • --main-class <class>:指定应用程序的主类。
  • --icon <icon>:指定应用程序的图标文件。
  • --vendor <vendor>:指定应用程序的供应商名称。
  • --runtime-image <path>:指定自定义的运行时镜像目录--runtime-image
  • --java-options "-D...":指定自定义VM运行参数。

MySQL打包准备

下载MySQL

进入MySQL官网,MySQL :: Download MySQL Community Server (Archived Versions),选择合适的打包,下载Zip版本。

image-20240513142720488

下载完成后解压,打开解压的文件夹,这里我采用将设置好账户和创建好相应表的数据库对应的data文件夹复制到刚刚解压的MySQL根目录下,这样子我只需要用命令行初始化MySQL,不需要去执行其他创建表和账户权限的语句,即可实现数据库的开箱即用。也可以是在初始化的bat文件里执行相关的sql语句,对应下面的myinit_admin.bat文件。

配置MySQL

在根目录下创建my.ini,输入以下内容:

[client]
port=3306
[mysql]
default-character-set=utf8
[mysqld]
port=3306
character-set-server=utf8
default-storage-engine=INNODB
max_connections=100
table_open_cache=256
tmp_table_size=35M
thread_cache_size=8
myisam_max_sort_file_size=100G
myisam_sort_buffer_size=69M
key_buffer_size=50M
read_buffer_size=64K
read_rnd_buffer_size=256K
sort_buffer_size=256K
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=1M
innodb_buffer_pool_size=96M
innodb_log_file_size=20M
innodb_thread_concurrency=18

创建两个bat文件,并且在执行bat的时候获取系统的管理员权限,如果没有管理员权限会无法初始化。

创建myinit_admin.bat文件,流程是先往my.ini里面写入mysql的路径和data文件对应的路径,获取管理员的权限进行MySQL初始化命令的执行。这个文件是在安装的时候执行。

echo
set CURRENT_DIR=%~dp0
set CURRENT_DIR=%CURRENT_DIR:\=/%
echo basedir="%CURRENT_DIR%">>%CURRENT_DIR%my.ini
echo datadir="%CURRENT_DIR%data/">>%CURRENT_DIR%my.ini

@echo off
 
:: 开始获取管理员权限
setlocal
set uac=~uac_permission_tmp_%random%
md "%SystemRoot%\system32\%uac%" 2>nul
if %errorlevel%==0 ( rd "%SystemRoot%\system32\%uac%" >nul 2>nul ) else (
    echo set uac = CreateObject^("Shell.Application"^)>"%temp%\%uac%.vbs"
    echo uac.ShellExecute "%~s0","","","runas",1 >>"%temp%\%uac%.vbs"
    echo WScript.Quit >>"%temp%\%uac%.vbs"
    "%temp%\%uac%.vbs" /f
    del /f /q "%temp%\%uac%.vbs" & exit )
endlocal

echo

cd /d %~dp0 

cd bin
 
"%cd%\mysqld.exe" --initialize-insecure --user=mysql --console
echo -----mysql init succee-----
 
mysqld install mysql 
echo -----mysql service install succee-----
 
net start mysql
sc config mysql start=auto 
net stop mysql
net start mysql
echo Installation complete 
 


timeout /nobreak /t 10
exit

创建mystop_admin.bat文件,同样需要获取管理员权限。这个文件是在MySQL卸载的时候执行

@echo off
 
:: 开始获取管理员权限
setlocal
set uac=~uac_permission_tmp_%random%
md "%SystemRoot%\system32\%uac%" 2>nul
if %errorlevel%==0 ( rd "%SystemRoot%\system32\%uac%" >nul 2>nul ) else (
    echo set uac = CreateObject^("Shell.Application"^)>"%temp%\%uac%.vbs"
    echo uac.ShellExecute "%~s0","","","runas",1 >>"%temp%\%uac%.vbs"
    echo WScript.Quit >>"%temp%\%uac%.vbs"
    "%temp%\%uac%.vbs" /f
    del /f /q "%temp%\%uac%.vbs" & exit )
endlocal


@echo off
cd /d %~dp0
echo ----1.[Mysql] start uninstalling Mysql ---->>../log.txt
sc stop mysql
sc delete mysql
echo ----2. [Mysql] uninstall finished---- >>../log.txt
exit

Inno Setup的安装和配置

进入Inno Setup Downloads (jrsoftware.org),进行下载安装。

创建一个文件夹,将MySQL和打包后的Java应用文件夹都放到一起,Java程序放在project文件夹下。

image-20240513144542795

创建Inno.iss文件,用inno Setup打开,在里面输入:

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
 
[Setup]
 
; 脚本由 Inno Setup 脚本向导 生成!
; 有关创建 Inno Setup 脚本文件的详细资料请查阅帮助文档!
 
#define MyAppName "Application"
#define MyAppVersion "1.0"
#define MyAppPublisher "zh"
#define MyAppExeName "application.exe"
 
[Setup]
; 注: AppId的值为单独标识该应用程序。
; 不要为其他安装程序使用相同的AppId值。
; (生成新的GUID,点击 工具|在IDE中生成GUID。)
AppId={{6CEE70A6-5DBD-43FF-9449-466A574C65E1}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}                                            
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
; 输入你要生成exe安装包的路径
OutputDir=E:\xxxx
; 输入程序安装后的文件名
OutputBaseFilename=Application
Compression=lzma
SolidCompression=yes
;AlwaysRestart=yes
;PrivilegesRequired=admin

[Languages]
Name: "chinesesimp"; MessagesFile: "compiler:Default.isl"
 
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 0,6.1
 
[Files]
Source: "E:\xxx\mysql-5.7.41-winx64\*"; DestDir: "{app}\mysql-5.7.41-winx64"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "E:\xxx\project\*"; DestDir: "{app}\project"; Flags: ignoreversion recursesubdirs createallsubdirs
; 注意: 不要在任何共享系统文件上使用“Flags: ignoreversion”
 
; Java exe对应的目录
[Icons]
Name: "{commondesktop}\Application";Filename: "{app}\project\applicaiton.exe"; WorkingDir: "{app}\project"
 
[INI]
;修改数据库配置文件(注意这个步骤,在上面的myinit_admin.bat已经获得了数据库和data的路径,但是不知道为什么我获取的路径会有点问题,在这个步骤也可以写入相应的路径。
;Filename:"{app}\mysql-5.7.41-winx64\my.ini";Section:"mysqld";Key:"basedir"; String:"{app}\mysql-5.7.41-winx64"
;Filename:"{app}\mysql-5.7.41-winx64\my.ini";Section:"mysqld";Key:"datadir"; String:"{app}\mysql-5.7.41-winx64\data"
 
 
; 安装的时候会执行
[Run]
Filename: "{app}\mysql-5.7.41-winx64\myinit_admin.bat";
 
; 卸载的时候会执行
[UninstallRun]
Filename: "{app}\mysql-5.7.41-winx64\mystop_admin.bat";
 
[UninstallDelete]
 
Type:filesandordirs;Name:"{app}"

在软件左上方点击run

image-20240513145623379

执行完成生成了一个exe安装包,双击这个安装包选择相应路径进行安装。只要Java程序已经配置好了相应的数据库连接,则安装后软件即可进行使用。

标签:exe,Java,--,uac%,傻瓜式,echo,mysql,MySQL,app
From: https://www.cnblogs.com/Johnyzh/p/18189313

相关文章

  • Java-SSM-Day01 Maven理论
    一、Maven的入门进阶1.1什么是Maven:掌控软件安装配置以及项目构建依赖管理的软件。1.3选用Maven-3.6.3 二、基于IDEA的Maven工程创建2.1梳理Maven工程GAVP属性:GroupId、ArtifactId、Version、PackagingGroupId格式:com.mingxi.业务线.子业务线ex:com.......
  • Net8 webAPI 创建(傻瓜式入门)
    前沿学不止境(还是用windows学习吧mac太不友好了)让我来新建个Net8webapicore 然后看到这个页面选择不适用顶级语句然后配置你的目录  然后打开vsstudio看到编辑页面 可以在controllers里面创建新的.cs请求比如我新建了firstController  写入ge......
  • JAVA Comparator 自定义排序 源码分析
    对于一个数组来说如果我们想要从大到小排序一般会这么写Integer[]nums={1,2,3};Arrays.sort(nums,newComparator<Integer>(){@Overridepublicintcompare(Integera,Integerb){returnb-a;}});......
  • Java Chassis 3:接口维度负载均衡
    本文分享自华为云社区《JavaChassis3技术解密:接口维度负载均衡》,作者:liubao68。在JavaChassis3技术解密:负载均衡选择器中解密了JavaChassis3负载均衡在解决性能方面提供的算法。这次解密的技术来源于实际客户案例:在客户的微服务系统中,存在很多种不同逻辑的接口,以及特殊......
  • [LeetCode] 1584.连接所有点的最小费用 Kruskal And Prim 算法 Java 并查集
    Problem:1584.连接所有点的最小费用目录Kruskal算法复杂度CodePrim算法复杂度CodeKruskal算法复杂度时间复杂度:添加时间复杂度,示例:$O(mlog(m))$空间复杂度:添加空间复杂度,示例:$O(n)$CodeclassSolution{publicintminCostConnectPoints(int[][]po......
  • 基于Java的redis客户端的基本使用
    1.简介Java中redis客户端有jedis、lettuce、Redission等2.jedis的基本使用引入依赖<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.2.3</version></dependency>从jedis连接池获取je......
  • JavaSE之java基础语法
    关键字和保留字关键字定义和特点定义:被java语言赋予了特殊含义,用作专门用途的字符串。特点:关键字中所有字母都为小写。关键字不能用作变量名,方法名,类名,包名和参数。用于定义数字类型的关键字classinterfaceenumbyteshortintlongfloatdoublecharbooleanvoi......
  • 软工计算1—Java篇1 20240513
    Java中的函数重载函数重载(FunctionOverloading)是面向对象编程中的一个概念,它允许在同一个类中定义多个同名函数,但这些函数的参数列表必须不同。参数列表的不同可以体现在参数的类型、数量或顺序上。函数重载使得程序设计更加灵活,可以针对不同的参数类型或数量提供不同的函数实现......
  • Java 高效获取两个List中不同的元素集合
    /***借助Map来获取listA、listB的不同元素集合**@paramlistA集合A*@paramlistB集合B*@returnlist<String>不同元素集合*/publicstaticList<String>getDifferListByMap(List<String>listA,List<String>listB){List<String>differList=new......
  • 【问题解决】java.lang.NoSuchMethodError错误
    问题现象近期本人负责的一个SpringBoot模块出现了java.lang.NoSuchMethodError报错,问题情况如下:A类提供了setJumpType(Stringtype),B类调用A类的setJumpType(Stringtype)报错java.lang.NoSuchMethodError:com.xxx.A.setJumpType(Ljava/lang/String;)V在之前的发版的程序中,B......