使用InstallShield打包Tomcat+MySql+Jdk的Web运行环境详解

准备

下面模块的版本,是实际使用的版本,可以不局限下面的具体版本,主要了解打包的过程。

  • InstallShield2009
  • apache-tomcat-6.0.41
  • mysql-5.7.19-winx64

以上软件模块,都可以搜索到,具体地址就不提供了。

创建安装批处理文件

各个模块的目录结构如下:
在这里插入图片描述
对于Tomcat,它提供了【bin\service.bat】批处理,执行它可以创建Tomcat服务,例如:

echo 安装Tomcat服务[Last]
%homepath%\tomcat\apache-tomcat-6.0.41\bin\service.bat install dvcs_tomcat

对于MySql稍微麻烦些,首先它依赖VS2013的分发库

echo 安装VS2013发布库[MySql需要此库]
%homepath%\vcredist_x64_2013.exe

其次,需要修改MySql的my.ini文件的路径和一些设置,并拷贝到MySql的工作目录下。因为MySql有一个超时自动断开的连接的机制,为了保持其长时间连接,需要修改my.ini的设置:

[mysqld]
wait_timeout=31536000
interactive_timeout=31536000

为了达到自动化修改my.ini的设置,设计了一个模板文件【my_template.ini】,并且通过开发了一个EXE【ModifyMySqlIniFile.exe】来修改其中的路径和一些参数,最后通过批处理命令把它保存到MySql的工作目录下,具体命令如下:

echo 生成My.ini
%homepath%\ModifyMySqlIniFile.exe %homepath%\mysql\my_template.ini %homepath%\mysql\mysql-5.7.19-winx64 > %homepath%\mysql\mysql-5.7.19-winx64\my.ini

安装MySql服务和启动服务的命令如下:

echo 安装MySql服务
%homepath%\mysql\mysql-5.7.19-winx64\bin\mysqld --install dvcs_mysql --defaults-file=%homepath%\mysql\mysql-5.7.19-winx64\my.ini
echo 启动MySql服务
net start dvcs_mysql

创建应用数据库时,由于需要支持批处理,发现MySql可以执行外部Sql文件,所以我先建立一个Sql文件【create_db.txt】,具体内容如下:

create database dvcs;

在安装的批处理【real_install.bat】里,执行创建应用数据库,具体命令如下:

echo 创建数据库[dvcs]
"%cd%\mysql\mysql-5.7.19-winx64\bin\mysql" -h localhost -uroot -p123456 < %homepath%\mysql\mysql-5.7.19-winx64\create_db.txt

至此,基本的模块都可以通过批处理命令执行了,完整安装的批处理如下:

@ echo off  

::切换到工作目录
cd /d %~dp0
echo %cd%

set homepath="%cd%"

echo 安装VS2013发布库[MySql需要此库]
%homepath%\vcredist_x64_2013.exe

echo 生成My.ini
%homepath%\ModifyMySqlIniFile.exe %homepath%\mysql\my_template.ini %homepath%\mysql\mysql-5.7.19-winx64 > %homepath%\mysql\mysql-5.7.19-winx64\my.ini

echo 安装MySql服务
%homepath%\mysql\mysql-5.7.19-winx64\bin\mysqld --install dvcs_mysql --defaults-file=%homepath%\mysql\mysql-5.7.19-winx64\my.ini

echo 启动MySql服务
net start dvcs_mysql

echo 创建数据库[dvcs]
"%cd%\mysql\mysql-5.7.19-winx64\bin\mysql" -h localhost -uroot -p123456 < %homepath%\mysql\mysql-5.7.19-winx64\create_db.txt

echo 安装Tomcat服务[Last]
%homepath%\tomcat\apache-tomcat-6.0.41\bin\service.bat install dvcs_tomcat

还有一个问题,因为后面需要部署应用,不能缺少环境变量,因此也需要创建一个批处理文件【set_sys_env.bat】以执行自动化创建环境变量,具体内容如下:

@echo off
::切换到工作目录
cd /d %~dp0
echo %cd%

echo 用户环境变量
setx DVCS_HOME "%cd%"
setx JRE_HOME "%cd%\jdk1.8.0_131\jre"
setx CATALINA_HOME "%cd%\tomcat\apache-tomcat-6.0.41"
setx MYSQL_HOME "%cd%\mysql\mysql-5.7.19-winx64"

echo 系统环境变量
set regpath=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
set envname=DVCS_HOME
set envpath="%cd%"
reg add "%regpath%" /v %envname% /d %envpath% /f

set envname=JRE_HOME
set envpath="%cd%\jdk1.8.0_131\jre"
reg add "%regpath%" /v %envname% /d %envpath% /f

set envname=CATALINA_HOME
set envpath="%cd%\tomcat\apache-tomcat-6.0.41"
reg add "%regpath%" /v %envname% /d %envpath% /f

set envname=MYSQL_HOME
set envpath="%cd%\mysql\mysql-5.7.19-winx64"
reg add "%regpath%" /v %envname% /d %envpath% /f

并且为了保存安装时日志,安装和设置运行环境的批处理外层再封装一个批处理【install.bat】,将控制台输出重定向到文件里,具体内容如下:

@ echo off  

::切换到工作目录
cd /d %~dp0
echo %cd%

::设置环境变量
call set_sys_env.bat

::调用安装批处理
call real_install.bat > install.log

至此,安装批处理创建完毕。

创建卸载批处理文件

卸载Tomcat很简单,卸载其服务即可:

echo 删除Tomcat服务[Last]
%homepath%\tomcat\apache-tomcat-6.0.41\bin\service.bat remove dvcs_tomcat

卸载MySql稍微复杂些,不过参考安装的步骤,创建删除数据库的Sql文件【drop_db.txt】,具体内容如下:

drop database dvcs;

完整的卸载MySql的批处理【unstall_mysql.bat】内容如下:

set sqlhome="%MYSQL_HOME%"

echo 删除数据库[dvcs]
::%sqlhome%\bin\mysql -h localhost -uroot -p123456 < %sqlhome%\drop_db.txt
"%MYSQL_HOME%\bin\mysql.exe" -h localhost -uroot -p123456 < %sqlhome%\drop_db.txt

echo 停止MySql服务
net stop dvcs_mysql

echo 删除MySql服务
%sqlhome%\bin\mysqld --remove dvcs_mysql

删除环境变量的批处理【del_sys_env.bat】如下:

@echo off
echo 删除用户变量
set regpath=HKEY_CURRENT_USER\Environment
set envname=DVCS_HOME
reg delete "%regpath%" /v "%envname%" /f

set envname=JRE_HOME
reg delete "%regpath%" /v "%envname%" /f

set envname=CATALINA_HOME
reg delete "%regpath%" /v "%envname%" /f

set envname=MYSQL_HOME
reg delete "%regpath%" /v "%envname%" /f

echo 删除系统变量
set regpath=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
set envname=DVCS_HOME
reg delete "%regpath%" /v "%envname%" /f

set envname=JRE_HOME
reg delete "%regpath%" /v "%envname%" /f

set envname=CATALINA_HOME
reg delete "%regpath%" /v "%envname%" /f

set envname=MYSQL_HOME
reg delete "%regpath%" /v "%envname%" /f



再在外面封装一个卸载批处理【unstall.bat】,具体如下:

@ echo off  

::切换到工作目录
cd /d %~dp0

set homepath="%DVCS_HOME%"

echo 卸载MySql
call %homepath%\unstall_mysql.bat

echo 删除环境变量
call %homepath%\del_sys_env.bat

echo 删除Tomcat服务[Last]
%homepath%\tomcat\apache-tomcat-6.0.41\bin\service.bat remove dvcs_tomcat

至此卸载批处理也已创建完毕。

InstallShield打包

通过InstallShield打包,其实很简单,在主要的几个事件里调用安装和卸载的批处理即可,具体创建打包工程我就不多说了,因为这个视具体项目而定,我的打包工程类型为【InstallScript MSI Project】,不过需要注意的是运行环境在安装完成后需要重启计算机才有效,所以我在脚本里添加了重启计算机的命令。InstallShield的脚本如下:

//===========================================================================
//
//  File Name:    Setup.rul
//
//  Description:  Blank setup main script file
//
//  Comments:     Blank setup is an empty setup project. If you want to
//				  create a new project via. step-by step instructions use the
//				  Project Assistant.
//
//===========================================================================

// Included header files ----------------------------------------------------
#include "ifx.h"
// Note: In order to have your InstallScript function executed as a custom
// action by the Windows Installer, it must be prototyped as an 
// entry-point function.

// The keyword export identifies MyFunction() as an entry-point function.
// The argument it accepts must be a handle to the Installer database.
    
/* export prototype MyFunction(HWND); */

//---------------------------------------------------------------------------
// OnFirstUIBefore
//
// The OnFirstUIBefore event is called by the framework when the setup is
// running in first install mode. By default this event displays UI allowing
// the end user to specify installation parameters.   
//---------------------------------------------------------------------------
function OnFirstUIBefore()
    NUMBER nResult, nSetupType, nvSize, nUser;
    STRING szTitle, szMsg, szQuestion, svName, svCompany, szFile;
    STRING szLicenseFile;
	BOOL bCustom, bIgnore1, bIgnore2;
begin
    //SetTitle("Installation "+IFX_PRODUCT_NAME,0,BACKGROUNDCAPTION);
    // TO DO: if you want to enable background, window title, and caption bar title                                                                   
    // SetTitle( @PRODUCT_NAME, 24, WHITE );                                        
    // SetTitle( @PRODUCT_NAME, 0, BACKGROUNDCAPTION ); 	                  
    // Enable( FULLWINDOWMODE );						   
    // Enable( BACKGROUND );							  
    // SetColor(BACKGROUND,RGB (0, 128, 128));					   

    // Added in InstallShield 15 - Show an appropriate error message if
    // -uninst is specified and the product is not installed.
    if( REMOVEONLY ) then
        Disable( DIALOGCACHE );
		szMsg = SdLoadString( IDS_IFX_ERROR_PRODUCT_NOT_INSTALLED_UNINST );
   		SdSubstituteProductInfo( szMsg );
		MessageBox( szMsg, SEVERE );
		abort;
    endif;
    
	nSetupType = TYPICAL;	

Dlg_SdWelcome:
    szTitle = "";
    szMsg   = "";
    nResult = SdWelcome(szTitle, szMsg);
    if (nResult = BACK) goto Dlg_SdWelcome;
	
	szTitle   = "";
	svName    = "";
    svCompany = "";

Dlg_SdRegisterUser:
    szMsg = "";
    szTitle = "";
    nResult = SdRegisterUser( szTitle, szMsg, svName, svCompany );
    if (nResult = BACK) goto Dlg_SdWelcome;

Dlg_SetupType:   

Dlg_SdAskDestPath:    	
    nResult = SdAskDestPath(szTitle, szMsg, INSTALLDIR, 0);
    if (nResult = BACK) goto Dlg_SdRegisterUser;

Dlg_SdFeatureTree: 
    szTitle    = "";
    szMsg      = "";
    if (nSetupType = CUSTOM) then
		nResult = SdFeatureTree(szTitle, szMsg, INSTALLDIR, "", 2);
		if (nResult = BACK) goto Dlg_SdAskDestPath;  
    endif;

Dlg_SQL:
    nResult = OnSQLLogin( nResult );
    if( nResult = BACK ) then
    	if (!bCustom) then
    		goto Dlg_SetupType;    
    	else
    		goto Dlg_SdFeatureTree;
    	endif;
    endif;

Dlg_ValueAddedServices:
    nResult = OnFirstUIBeforeValueAddedServices( nResult );
    if (nResult = BACK) goto Dlg_SQL;

Dlg_SdStartCopy:
    szTitle = "";
    szMsg   = "";
    nResult = SdStartCopy2( szTitle, szMsg );			
	
	if (nResult = BACK) then
    	goto Dlg_ValueAddedServices;
    endif;

    // Added in IS 2009 - Set appropriate StatusEx static text.
    SetStatusExStaticText( SdLoadString( IDS_IFX_STATUSEX_STATICTEXT_FIRSTUI ) );

    // setup default status
    Enable(STATUSEX);
 
    return 0;
end;
//---------------------------------------------------------------------------
// OnMaintUIBefore
//
// The OnMaintUIBefore event is called by the framework when the setup is
// running in maintenance mode. By default this event displays UI that
// allows the end user to add or remove features, repair currently
// installed features or uninstall the application.
//---------------------------------------------------------------------------
function OnMaintUIBefore()
	NUMBER nResult, nType;
	STRING szTitle, szMsg, svDir, svResult, szCaption,szCmd,szDir;
begin 
    //SetTitle("Installation "+IFX_PRODUCT_NAME,0,BACKGROUNDCAPTION);
    //加入终止进程函数
     
	// TO DO: if you want to enable background, window title, and caption bar title   								
	// SetTitle( @PRODUCT_NAME, 24, WHITE );					
	// SetTitle( @PRODUCT_NAME, 0, BACKGROUNDCAPTION );  			
	// SetColor(BACKGROUND,RGB (0, 128, 128));					
	// Enable( FULLWINDOWMODE );						
	// Enable( BACKGROUND );							

Dlg_Start:

    nType = REMOVEALL; 
    nResult = MessageBox( SdLoadString( IFX_MAINTUI_MSG ), MB_YESNO );
		if (nResult != IDYES ) then
            abort;
        endif; 
     
    // 删除服务    
    szCmd = TARGETDIR ^ "\\DVCSRunPlatform\\unstall.bat"; 
    LaunchAppAndWait(szCmd,"",LAAW_OPTION_WAIT|LAAW_OPTION_SHOW_HOURGLASS|LAAW_OPTION_HIDDEN);  
    
	switch(nType)
        case REMOVEALL: 
            ComponentRemoveAll();

            // Added in IS 2009 - Set appropriate StatusEx static text.
            SetStatusExStaticText( SdLoadString( IDS_IFX_STATUSEX_STATICTEXT_MAINTUI_REMOVEALL ) );

        case REPAIR:
        
            ComponentReinstall();

            // Added in IS 2009 - Set appropriate StatusEx static text.
            SetStatusExStaticText( SdLoadString( IDS_IFX_STATUSEX_STATICTEXT_MAINTUI_REPAIR ) );


        case MODIFY:

            // Added in IS 2009 - Set appropriate StatusEx static text.
            SetStatusExStaticText( SdLoadString( IDS_IFX_STATUSEX_STATICTEXT_MAINTUI_MODIFY ) );

    endswitch;
    
	// setup default status 
	SetStatusWindow(0, "");
	Enable(STATUSEX);
	StatusUpdate(ON, 100);
end;
//---------------------------------------------------------------------------
// OnMaintUIAfter
//
// The OnMaintUIAfter event called by the framework after the file transfer
// of the setup when the setup is running in maintenance mode. By default
// this event displays UI that informs the end user that the maintenance setup
// has been completed successfully.
//---------------------------------------------------------------------------
function OnMaintUIAfter()
    STRING szTitle, szMsg1, szMsg2, szOpt1, szOpt2;
    NUMBER bOpt1, bOpt2;
begin
	Disable(STATUSEX);
    
    if( REMOVEALLMODE ) then
        szTitle = SdLoadString(IFX_SDFINISH_REMOVE_TITLE);
        szMsg1 = SdLoadString(IFX_SDFINISH_REMOVE_MSG1);
                
    	DeleteProgramFolder(TARGETDIR+"DVCSRunPlatform");
    	DeleteProgramFolder(FOLDER_PROGRAMS+"DVCSRunPlatform");         
    else
        szTitle = SdLoadString(IFX_SDFINISH_MAINT_TITLE);    
        szMsg1  = SdLoadString(IFX_SDFINISH_MAINT_MSG1);
    endif;

	bOpt1   = FALSE;
    bOpt2   = FALSE;    

    if ( BATCH_INSTALL ) then
    	SdFinishReboot ( szTitle , szMsg1 , SYS_BOOTMACHINE , szMsg2 , 0 );
    else    
       	SdFinish ( szTitle , szMsg1 , szMsg2 , szOpt1 , szOpt2 , bOpt1 , bOpt2 );
    endif;                                                              
    
   	/* if(REMOVEALLMODE)  then
    	SdFinishReboot ( @IDS_Z_REBOOT_TITLE ,@IDS_Z_REBOOT_MESG , SYS_BOOTMACHINE , "" , 0 );
    endif;  */
end;

//---------------------------------------------------------------------------
// OnFirstUIAfter
//
// The OnFirstUIAfter event called by the framework after the file transfer
// of the setup when the setup is running in first install mode. By default
// this event displays UI that informs the end user that the setup has been
// completed successfully.
//---------------------------------------------------------------------------
function OnFirstUIAfter()
    STRING szTitle, szMsg1, szMsg2, szOpt1, szOpt2,szFile;
    NUMBER bOpt1, bOpt2,nResult;
begin
	Disable(STATUSEX);
    
	bOpt1   = FALSE;
    bOpt2   = FALSE;    

    if ( BATCH_INSTALL ) then
    	SdFinishReboot ( szTitle , szMsg1 , SYS_BOOTMACHINE , szMsg2 , 0 );
    else
	    SdFinish ( szTitle , szMsg1 , szMsg2 , szOpt1 , szOpt2 , bOpt1 , bOpt2 );
	endif;
	SdFinishReboot ( szTitle , szMsg1 , SYS_BOOTMACHINE , szMsg2 , 0 );
end;

//---------------------------------------------------------------------------
// OnInstallFilesActionAfter
//
// The InstallFilesActionAfter event is called just after the standard MSI
// action 'InstallFiles' is executed.
//---------------------------------------------------------------------------
function OnInstallFilesActionAfter() 
STRING  szDir;
STRING	szCmd; 
NUMBER ret;
begin         
	if( REMOVEALLMODE ) then
		
	else           
	     
	    // 设置环境变量     
	    /* szCmd = TARGETDIR ^ "\\DVCSRunPlatform\\set_sys_env.bat"; 
	    LaunchAppAndWait(szCmd,"",LAAW_OPTION_WAIT|LAAW_OPTION_SHOW_HOURGLASS|LAAW_OPTION_HIDDEN);
	    */  
     
	    // 安装服务     
	    szCmd = TARGETDIR ^ "\\DVCSRunPlatform\\install.bat"; 
	    LaunchAppAndWait(szCmd,"",LAAW_OPTION_WAIT|LAAW_OPTION_SHOW_HOURGLASS|LAAW_OPTION_HIDDEN);  
		
	endif;
end;
//---------------------------------------------------------------------------
//  OnResumeUIBefore
//
//  The OnResumeUIBefore event is called when end user runs installation that
//  is performing a resumed install. Usually this happens by specifying
//  a property like REINSTALL or ADDLOCAL at the command line when the 
//  product is already installed. After this function returns, 
//  ComponentTransferData is called to perform file transfer.
//---------------------------------------------------------------------------
function OnResumeUIBefore()
	int    nResult;
	string szTitle, szMsg ,szCmd;
begin

    //加入终止覆盖函数函数

    /*MessageBox("The installation has detected that DVCS Server has been installed. " +
    		     "Please uninstall the DVCS Server, " + "then restart the installation process.", INFORMATION);
    abort; */
    
Dlg_SdWelcome:
	szTitle = SdLoadString(ISWI_RESUMEUI_TITLE);
	szMsg = SdLoadString(ISWI_RESUMEUI_MSG);
    nResult = SdWelcome(szTitle, szMsg);

    // Added in IS 2009 - Set appropriate StatusEx static text.
    szMsg = SdLoadString( IDS_IFX_STATUSEX_STATICTEXT_UPDATEUI );
	SdSubstituteProductInfo( szMsg );
    SetStatusExStaticText( szMsg );

	Enable(STATUSEX);
	                              
	// 删除服务
	szCmd = TARGETDIR ^ "\\DVCSRunPlatform\\unstall.bat"; 
    LaunchAppAndWait(szCmd,"",LAAW_OPTION_WAIT|LAAW_OPTION_SHOW_HOURGLASS|LAAW_OPTION_HIDDEN);             

end;

以上介绍了所有步骤,希望对大家有所帮助。下一篇,我将介绍怎样在已经部署好的Web运行环境下部署Web应用。

猜你喜欢

转载自blog.csdn.net/ptrunner/article/details/87687774