因为公司需求, 要在 windows 的环境上做一键部署启动 java 项目, 同时还要支持从安装界面动态修改配置文件的 IP 地址. 就像安装软件一样将 jdk,tomcat,mysql,influxdb,nginx 安装并配置到系统上, 顺便还要初始化一下数据. 花了一周的时间, 这里记录我的踩坑日志.
准备工作
磨刀不误砍柴工, 选择好工具可以事半功倍.
一),Inno Setup, 一款为 Windows 程序提供的免费安装程序, 通过它可以将需要的文件压缩打包成 exe 安装程序, 然后像安装程序一样解压到另外一个环境中. 官网地址 http://www.jrsoftware.org/isinfo.php
二), 虚拟机, 开两台虚拟机的作用: 第一可以避免玩坏自己的电脑, 第二可以保证每次测试安装的环境都是干净的系统, 减少一些不必要的麻烦. 对电脑的性能有点要求.
三),JDK1.8,MySQL5.7,Tomcat8,Nginx,InfluxDB 等, 这是需要压缩的文件资源.
四),Windows Server 2012 R2, 你值得拥有, 用 2008 安装 MySQL 会很不顺.
Inno Setup 基础使用
Inno Setup 的模版几乎一样, 通过官方提供的 innosetup-QSP.exe 可以帮助我们快速生成模版. 但如果需要自定义界面, 那你可就要挠挠头呢. 比如我现在的需求是在安装的过程中添加一个有输入框的界面, 并且能将输入的值替换指定配置文件中的指定内容, 安装成功后在桌面生成快捷键.
对于 bat 脚本语言很薄弱的我来说这里有两个难点, 但依葫芦画瓢还是可以做出来的.
一),Inno Setup 的函数, 在
代码块中, Inno Setup 提供了很多功能来折磨, 不来满足我们的需求. 具体可以参考在线的文档 http://www.jrsoftware.org/ispphelp/index.php
二), 需要用 bat 脚本配置 jdk 环境变量, 安装部署 Tomcat, 安装部署 MySQL.
千篇一律的 iss 文档:
- #define MyAppName "自定义程序名称"
- #define MyAppVersion "V1.0"
- #define MyAppPublisher "自定义程序出版商"
- #define MyAppURL "http://www.xxxx.com/"
; 基本配置
- [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.)
; 单独标识, 可以通过 innosetup-QSP-5.6.1.exe 工具自动生成
- AppId={{0167D65D-549A-4BA3-B88A-4814EC5A1D35}
- AppName={#MyAppName}
- AppVersion={#MyAppVersion}
- AppPublisher={#MyAppPublisher}
- AppPublisherURL={#MyAppURL}
- AppSupportURL={#MyAppURL}
- AppUpdatesURL={#MyAppURL}
; 默认安装路径
- DefaultDirName=C:\Program Files\ITDragon\
- DefaultGroupName={#MyAppName}
; 软件名称
OutputBaseFilename=ITDragon
; 软件图标
SetupIconFile=C:\Users\Long\Desktop\ok\ITDragon\itdragon.ico
; 压缩方式
Compression=lzma
; yes 可以使文件更小
SolidCompression=yes
; 必需有管理员权限才能安装
PrivilegesRequired=admin
; 安装密码
;Password=itdragon
; 开启加密, 需要一个 iscrypt.dll 文件, 网上有下载的
;Encryption=yes
; 语言配置
- [Languages]
- Name: "english"; MessagesFile: "compiler:Default.isl"
; 安装文件
[Files]
; 安装部署的源文件路径
- Source: "C:\Users\Long\Desktop\ITDragon\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
- ; NOTE: Don't use"Flags: ignoreversion" on any shared system files
; 快捷键
- [Icons]
- Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"
- Name: "{commondesktop}\ 快捷 HTTP 地址"; Filename: http://localhost
- Name: "{commondesktop}\Mysql 数据初始化脚本"; Filename: "{app}\mysql\init-data.bat"
- Name: "{commondesktop}\ 安装须知"; Filename: "{app}\ 安装须知. doc"
; 程序安装成功后执行脚本
- [Run]
- Filename: "{app}\tomcat\init-jdk.bat";
- Filename: "{app}\tomcat\bin\init-tomcat.bat";
- Filename: "{app}\mysql\bin\init-mysql.bat";
; 在安装的时候输入 IP 地址, 动态将 localhost 修改为输入值
- var
- myPage:TwizardPage;// 自定义窗口
- ed1:TEdit;// 自定义输入框
- Lbl1: TNewStaticText;// 自定义标题
- // 初始化引导窗口
- procedure InitializeWizard();
- begin
- myPage:=CreateCustomPage(wpWelcome, '配置服务 IP 地址', '请输入正确的 IP 地址, 已确保服务的正常使用');
- Lbl1 := TNewStaticText.Create(myPage);
- Lbl1.Left := ScaleX(5);
- Lbl1.Top := ScaleY(5);
- Lbl1.Width := ScaleX(250);
- Lbl1.Height := ScaleY(50);
- Lbl1.Caption := 'IP 地址输入框标题';
- Lbl1.Parent := myPage.Surface;
- ed1:=TEdit.Create(myPage);
- ed1.Width:=ScaleX(410);
- ed1.Top := ScaleY(25);
- ed1.Text :='127.0.0.1';
- ed1.Parent:=myPage.Surface;
- end;
- procedure CurStepChanged(CurStep: TSetupStep);
- var
- fileName:String;
- svArray: TArrayOfString;
- nLines,i:Integer;
- begin
- // 复制文件后执行
- if CurStep = ssPostinstall then
- begin
- fileName := ExpandConstant('{app}\nginx\html\main.bundle.js');
- LoadStringsFromFile(fileName, svArray);// 读取文件
- nLines := GetArrayLength(svArray);
- for i := 0 to nLines - 1 do
- if (0 < Pos('localhost', svArray[i])) then// 查找目标
- StringChange(svArray[i], 'localhost', ed1.Text);
- SaveStringsToUTF8File(fileName, svArray, false);
- end;
- end;
注意:
一), 如果你不需要自定义函数,
代码块都可以删掉
二), 点击 Inno Setup 上的 compile 按钮开始编译, 编译成功后会在一个 Output 目录夹生成 exe 文件, 这个 Output 目录一般和 iss 文件在同一级.
配置 JDK 环境变量
在做这个需求的时候, 看了几篇文章, 发现他们都把 jdk 放在 Tomcat 目录中, 第一次做的时候也傻乎乎的放在 Tomcat 目录中, 其实没必要. 而且目前主流的 springboot 项目都是内嵌 tomcat. 新建一个 bat 脚本用来运行 java 程序 java -jar xxx.jar 安装成功后在桌面生成一个快捷键, 让用户双击启动服务. 如果你有更合理的方法, 可以教教我!!!
init-jdk.bat, 内容来源网络, 修改时需要目录层级关系:
- @echo off
- echo
- cd ..
- echo "%~dp0"
- echo "%cd%"
- set jdkpath=%cd%\tomcat\bin\java\jdk
- echo %jdkpath%
- setx JAVA_HOME "%jdkpath%" -m
- setx CLASSPATH ".;%%JAVA_HOME%%\lib\tools.jar;%%JAVA_HOME%%\lib\dt.jar" -m
- echo %Path%
- echo %Path%|find /i "%java_home%" && set IsNull=true || set IsNull=false
- echo %IsNull%
- if not %IsNull%==true (
- reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /t REG_SZ /d "%Path%;%%JAVA_HOME%%\bin;%%JAVA_HOME%%\jre\bin" /f
- setx Path "%%JAVA_HOME%%\bin;%Path%"
- )
- exit
Tomcat 安装部署
需要将 init-tomcat.bat 文件放在 tomcat/bin 目录下, 有博客说要修改 service.bat 文件, 我没有修改依然可以正常启动. 在看别人的博客的时候, 遇到不明白的地方可以先试着跳过去. 我就傻乎乎的下了一个 tomcat6, 对比两者有什么区别......
- echo -------tomcat begin--------
- call "%~dp0%service.bat" install tomcat8
- echo -------tomcat install end------------------
- sc config tomcat8 start= auto
- net start tomcat8
- exit
MySQL 安装部署
MySQL 安装需要注意两点: 第一设置数据库初始密码, 第二设置数据库编码格式,
一), 初始化数据库的时候不要生成密码, 方便后期修改, 命令
mysqld.exe --initialize-insecure --user=mysql --console
二), 数据库的编码格式要统一为 utf8, 网上很多方法都是在 my.ini 文件中配置编码格式, 可 MySQL5.7 没有该文件, 没有我们可以创建一个. 但 MySQL5.6 如果手动创建 my.ini 文件可能在启动服务时有问题.
init-mysql.bat, 内容来源网络, 稍作修改.
- cd /d %~dp0
- cd ..
- set inipath=%cd%\my.ini
- cd bin
- "%cd%\mysqld.exe" -install mysql --defaults-file="%inipath%"
- "%cd%\mysqld.exe" --initialize-insecure --user=mysql --console
- net start mysql
- sc config mysql start=auto
- net stop mysql
- net start mysql
echo 安装完毕
"%cd%\mysqladmin.exe" -u root password root
echo 修改密码完毕
- cd ..
- "%cd%\bin\mysql.exe" -uroot -proot < "%cd%\sqlfile\initMysql.sql"
echo 数据库初始化完成
pause;
initMysql.sql, 用来创建数据库和设置编码. MySQL 启动成功后, 我们还是要进去执行
show variables like '%char%;'
看看是不是统一修改成了 utf8
- create database IF NOT EXISTS itdragon_data character set utf8;
- set global character_set_database=utf8;
- set global character_set_server=utf8;
遇到的坑
用了 Inno Setup 工具, 一键部署配置 web 项目变的很简单, 只需要将部署的资源压缩成 exe 文件, 然后点击 exe 文件待安装成功后执行自动运行 bat 文件初始化配置即可. 可我依然花了很长的时间. 原因有几点:
一), 开始安装的环境是 Windows Server 2008, 安装 MySQL5.7 失败, 原因是不支持 MySQL5.7 提供的高级读写锁. 后来换成了 MySQL5.6 安装成功
二),MySQL5.6 启动服务失败 1067, 网上也有很多解决方法, 没有一个成功. 无奈换了 WIndows Server 2012 r2, 结果一次成功.
三), 对 Inno Setup 函数使用不熟, 资源文件太大, 每次编译调试要等待半小时.
文章到这里就结束了, InfluxDB 和 Nginx 就更简单了, 一样的逻辑. 希望大家把时间用到正确的地方. 如果觉得不错可以点个 "推荐"
参考文章:
- https://blog.csdn.net/liuhaomatou/article/details/52576162
- https://blog.csdn.net/dj0721/article/details/72462688
来源: https://www.cnblogs.com/itdragon/p/9283397.html