前言
博主目前在一所小型公司上班,公司的业务比较传统,做的不是互联网项目。近来一段,公司需要发布产品,需要对目前的项目进行打包,博主是一个刚毕业的菜鸟,老大把这项任务给我的时候整个人都是蒙的。之前从来没有听说过打包,只是知道一个exe运行一下即可,深入了解之后,打包可不是一个简单的压缩和解压的过程,这篇文章和大家分享一下我的所得。
本篇不介绍nsis的简介及使用,在网上可以搜到一大堆,本篇写的比较基础,没有用到nsis美化插件等等。
打包需求分析
- 首先要将主要程序打包进去,这是我们的主要目的
- 程序打包后需要附带一些运行环境(中间件及数据库等等),比如我的程序中的tomcat及mysql
- 只是压缩和解压是不行的,用户不可能会自己去配置和启动我们的项目,所以需要我们在打包的时候要配置好我们的运行环境
在明白了自己打包的需求后,我们就要着手准备自己打包的对象了,我建议在做打包之前要自己模拟一遍打包的流程,这样你会清楚很多,一遍流程下来之后就大概明白了自己需要去做些什么。我个人在做打包之前是在一个本子上画的流程,下面贴出我的流程图。
打包对象
- 运行环境 tomcat8 + mysql5.7 + jdk1.8
- 主程序文件(***.war)
- sql脚本
- 运行脚本(***.bat等等,此处接下来的文章会讲到)
规划目录
以下贴出我的打包工程目录规划
其中,NSIS目录为NSIS软件所在目录,language.nsi是编译脚本所需要的语言包,YourSoftwareLicence是软件须知
准备资源
首先我们要准备打包的资源,此处我准备的运行环境全都是绿色版免安装的,资源网上都能找到,如果你需要可以私信我我发给你。
Tomcat8
关于tomcat我想不用多说什么,其实就是一个端口号设置的问题,端口号设置在conf文件夹下,在我的打包程序中并没有去检测客户端机器端口号占用问题,只是去给他设置了一个值8081
MySQL5.7
数据库是我整打包以来遇到问题最多的一项,因为绿色版的mysql在安装后由于客户端机器不同,造成的问题也花样百出,大多是Access denied等问题,在探索了很多遍之后终于整理出了一个稳定版本的mysql(原谅我是个菜鸟。。。)
jdk1.8
这个我就不多说了,没什么改动
主程序文件
在我目前的规划中,我要发布的war包在打包之前是直接放入tomcat的webapp下的,你也可以修改tomcat的web.xml设置将要发布的程序包单独放置,这样会清楚一点。
SQL脚本
我这里指的sql脚本可不是从Navicat里面导出的脚本,这里需要的是建库脚本,建议使用powerdesigner等工具编写一个标准的建库脚本。
编写打包脚本
在撤了这么多之后,终于要介绍我们的打包了,在这一步中最为重要的就是打包脚本了,我的定义里打包脚本分为两个:
- 在用户执行安装后所需要运行的可执行脚本(用来达到我们想要达到的目的)
- nsis打包脚本(用于nsis编辑器识别并“加工”出我们想要的可执行程序)
可执行脚本编写
可执行脚本说白了其实在我的工程中指的是.bat文件,为什么需要这个东西呢,因为上文我们说到单单解压我们的资源是不行的,比如说我们的开机自启(注册为服务模式)、导入数据库等等,这些操作一个解压过程是满足不了的,所以我暂时能想到的就是利用批处理命令(bat)来达到我的目的。
主要目标有以下几个:
1、可修改程序运行必要的配置文件
2、将mysql、tomcat注册为服务
3、设置开机自启
4、导入数据库操作
5、启动服务
6、卸载服务
以下贴出以上几个bat文件的编写
(1)修改配置文件.bat
@echo off
setlocal enabledelayedexpansion
chcp 936
cd /d %~dp0
set startDir=%cd%
cd ../
set mpath=%cd%
我的程序中有需要修改的配置,故用此bat文件来修改,你也可以用这种方法去修改别的配置文件
@echo 修改上传下载的地址
set wtusfile=%mpath%\apache-tomcat\webapps\tus_servlet\WEB-INF\web.xml
echo %wtuspath%
for %%i in ("%wtusfile%") do set wtusfile=%%~fi
echo.
set oldtuspath=wtuspath
echo.
set newtuspath=%mpath%\apache-tomcat\webapps\SIS_TBMS_SYS_V5.0\files\
for /f "delims=" %%i in ('type "%wtusfile%"') do (
set str=%%i
set "str=!str:%oldtuspath%=%newtuspath%!"
echo !str!>>%wtusfile%_tmp.txt
)
move "%wtusfile%"_tmp.txt "%wtusfile%"
(2)安装服务.bat
@echo off
@echo 正在安装MySQL服务......
cd /d %~dp0
cd ../
echo %cd%
set startDir=%cd%
set myIni=%startDir%\mysql\my.ini
cd "%startDir%\mysql\bin"
%startDir%\mysql\bin\mysqld --install MySQLOfSIS "--defaults-file=%myIni%"
@echo MySQL服务安装成功
@echo ***************************************
//此处的MySQLOfSIS是你的服务名称,可以自定义
@echo 正在安装Tomcat服务......
set JAVA_HOME=%startDir%\jdk1.8.0_66
set JRE_HOME=%startDir%\jdk1.8.0_66\jre
set
echo %JRE_HOME%
echo %JAVA_HOME%
cd "%startDir%\apache-tomcat\bin"
service.bat install
@echo Tomcat服务安装成功
@echo ***************************************
(3)服务开机自启.bat
@echo off
@echo .................................
@echo .................................
@echo Tomcat服务设置开机自启...
sc config Tomcat8 start= auto
net start Tomcat8
@echo Tomcat服务启动成功
@echo .................................
@echo .................................
@echo MySQL设置开机自启...
sc config MySQLofSIS start= auto
net start MySQLOfSIS
@echo MySQL服务启动成功
@echo .................................
@echo .................................
(4) 导入数据库.bat
@echo off
setlocal enabledelayedexpansion
chcp 936
@echo 正在导入数据库,此过程时间稍长,请稍后。。。。
cd /d %~dp0
cd ../
set startDir=%cd%
SET dbhost=localhost
SET dbuser=root
SET dbpassword=root
SET sqlpath=%startDir%\sql\***.sql
cd mysql\bin
mysql -h%dbhost% -u%dbuser% -p%dbpassword% < %sqlpath% --default-character-set=utf8
(5)启动平台.bat(如设置开机自启此脚本功能不大)
@echo off
title 运行平台 Ctrl+C键结束服务
@echo 正在启动运行平台...
cd /d %~dp0
set startDir=%cd%
echo %startDir%|findstr /ibe "[0-9a-z:\\\~\!\@\#\$\(\)\_\+\`\-\=\;\'\.\,]*">nul&&goto run||goto error
:error
echo 错误:不要把版本解压放在包含有中文、空格和特殊字符的目录!
pause
goto end
:run
@echo .
@echo ...小提示..................................................................
@echo . .
@echo . 连接方式 .
@echo . 浏览器地址:http://127.0.0.1 . .
@echo . .
@echo ...........................................................................
cd "%startDir%\apache-tomcat\bin"
start /B startup.bat
:end
(6)卸载服务.bat
@echo off
@echo 正在卸载MySQL服务......
cd /d %~dp0
cd ../
set startDir=%cd%
set myIni=%cd%\mysql\my.ini
cd "%startDir%\mysql\bin"
net stop MySQLofSIS
%startDir%\mysql\bin\mysqld --remove MySQLOfSIS
@echo 卸载MySQL服务成功
@echo ***********************************
@echo 正在卸载tomcat服务
cd "%startDir%\apache-tomcat\bin"
service.bat remove
@echo 卸载tomcat服务成功
pause
以上六个脚本也是我们需要打包的内容。
NSIS脚本编写
; 该脚本使用 HM VNISEdit 脚本编辑器向导产生
; 安装程序初始定义常量
!define PRODUCT_NAME "xxx系统"
!define PRODUCT_VERSION "5.0"
!define PRODUCT_PUBLISHER "My company, Inc."
!define PRODUCT_WEB_SITE "http://www.mycompany.com"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
SetCompressor lzma
; ------ MUI 现代界面定义 (1.67 版本以上兼容) ------
!include "MUI.nsh"
; MUI 预定义常量
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\arrow-uninstall.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"
!define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\orange.bmp"
; 欢迎页面
!define MUI_WELCOMEFINISHPAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Wizard\orange.bmp"
!insertmacro MUI_PAGE_WELCOME
; 许可协议页面
!define MUI_LICENSEPAGE_RADIOBUTTONS
!insertmacro MUI_PAGE_LICENSE "YourSoftwareLicence.txt"
; 安装目录选择页面
!define MUI_PAGE_HEADER_SUBTEXT "建议不要将程序安装到中文路径"
!insertmacro MUI_PAGE_DIRECTORY
; 安装过程页面
!insertmacro MUI_PAGE_INSTFILES
; 安装完成页面
!insertmacro MUI_PAGE_FINISH
; 安装卸载过程页面
!insertmacro MUI_UNPAGE_INSTFILES
; 安装界面包含的语言设置
!insertmacro MUI_LANGUAGE "SimpChinese"
; 安装预释放文件
!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
; ------ MUI 现代界面定义结束 ------
Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "SISSetup.exe"
InstallDir "$PROGRAMFILES\tbms"
ShowInstDetails show
ShowUnInstDetails show
BrandingText " xxx技术股份有限公司"
Section "MainSection" SEC01
SetOutPath "$INSTDIR"
SetOverwrite ifnewer
File /r "D:\package\bag\*.*"
ExecWait "$INSTDIR/bin/修改配置文件.bat"
ExecWait "$INSTDIR/bin/安装SIS服务.bat"
ExecWait "$INSTDIR/bin/服务开机自启.bat"
ExecWait "$INSTDIR/bin/导入数据库.bat"
SectionEnd
Section 添加快捷方式
WriteIniStr "$DESKTOP\你的系统名.url" "InternetShortcut" "URL" "http://localhost:8081/***"
SectionEnd
Section -AdditionalIcons
WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}"
CreateDirectory "$SMPROGRAMS\xxx系统"
CreateShortCut "$SMPROGRAMS\xxx系统\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url"
CreateShortCut "$SMPROGRAMS\xxx系统\Uninstall.lnk" "$INSTDIR\uninst.exe"
SectionEnd
Section -Post
WriteUninstaller "$INSTDIR\uninst.exe"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
SectionEnd
/******************************
* 以下是安装程序的卸载部分 *
******************************/
Section Uninstall
ExecWait "$INSTDIR/bin/卸载服务.bat"
Delete "$INSTDIR\${PRODUCT_NAME}.url"
Delete "$INSTDIR\uninst.exe"
delete "$DESKTOP\你的系统名.url"
Delete "$SMPROGRAMS\xxx系统\Uninstall.lnk"
Delete "$SMPROGRAMS\xxx系统\Website.lnk"
RMDir "$SMPROGRAMS\xxx系统"
RMDir /r "$INSTDIR\sql"
RMDir /r "$INSTDIR\mysql"
RMDir /r "$INSTDIR\jdk1.8.0_66"
RMDir /r "$INSTDIR\bin"
RMDir /r "$INSTDIR\apache-tomcat"
RMDir "$INSTDIR"
DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
SetAutoClose true
SectionEnd
#-- 根据 NSIS 脚本编辑规则,所有 Function 区段必须放置在 Section 区段之后编写,以避免安装程序出现未可预知的问题。--#
Function .onInit
InitPluginsDir
;创建互斥防止重复运行
System::Call 'kernel32::CreateMutexA(i 0, i 0, t "WinSnap_installer") i .r1 ?e'
Pop $R0
StrCmp $R0 0 +3
MessageBox MB_OK|MB_ICONEXCLAMATION "有一个安装向导已经运行!"
Abort
FunctionEnd
Function un.onInit
MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "您确实要完全移除 $(^Name) ,及其所有的组件?" IDYES +2
Abort
FunctionEnd
Function un.onUninstSuccess
HideWindow
MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) 已成功地从您的计算机移除。"
FunctionEnd
以上的代码不难理解,你也可以用NSIS里的脚本向导来生成脚本,生成出来之后可以参考我的脚本来进行改造,点击编译即可在目录内生成你要的***.exe文件。
分割线
最初版做出来之后,老大觉得安装包有点大,毕竟没有做相应的简化,最后针对mysql及jdk进行简化,前后减去了大概400m左右,简化的教程网上也有,另外,看到这篇文章的朋友或大牛们若有任何好的建议麻烦您提出来,互相学习。如果需要我的整套开发文件夹私信我给你。
小弟写的博客不多,排版也不是很规整,各位大哥请指正哈...