inno Setup 打包Java exe可執行檔案和MySQL資料庫,無需額外配置實現一鍵傻瓜式安裝

scottyzh發表於2024-05-13

前言

出現有需要打包 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程式已經配置好了相應的資料庫連線,則安裝後軟體即可進行使用。

相關文章