nsis打包tomcat,jdk,javaweb
2015-06-19 17:30
603 查看
这段时间一直在做一个关于javaweb打包成exe文件。这里面涉及到tomcat的注册成服务,并且将服务设为自动启动的方式,
首先要确保tomcat的bin目录下有service.bat文件,这个文件里有许多关于处理tomacat的命令,
首先用编辑器打开service.bat文件,然后在里面修改一下jvm的最大最小内存,然后在
goto end
:installed
后面加上
sc config %SERVICE_NAME%= auto
net start %SERVICE_NAME%
这里的%SERVICE_NAME%是指执行service.bat install [servicename]中的servciename,
然后打开cmd窗口,cd "你安装到的tomcat下的bin目录"
然后执行service.bat install [servicename] 即可
如果是想要在没有jre的环境下的windows中安装,则需要布置JAVA_HOME或者是JRE_HOME,但是有一点需要注意的是在配置过环境变量以后如果卸载的时候是需要将tomcat的环境变量和java的环境变量置为空的。
在这里附上我的代码,写的不好的地方还请指正:
; 该脚本使用 HM VNISEdit 脚本编辑器向导产生
; 安装程序初始定义常量
!define PRODUCT_NAME "测试打包系统"
!define PRODUCT_VERSION "1.0"
!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\${PRODUCT_NAME}.exe"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
!define PRODUCT_STARTMENU_REGVAL "NSIS:StartMenuDir"
; 定义系统环境变量的注册表key值,用于向环境变量CATALINA_HOME里写入安装目录,锁定tomcat
!define WriteEnvStr_RegKey 'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"'
SetCompressor lzma
; MUI 1.67 compatible ------
!include "MUI.nsh"
;定义注册表主键,用于判断服务器是否已安装JDK,有继续安装,无退出安装,(必须带上LogicLib.nsh)
!define HKEY_LOCAL_MACHINE 0x80000002
!include LogicLib.nsh
; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\orange-install.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\orange-uninstall.ico"
; 欢迎页面
!insertmacro MUI_PAGE_WELCOME
; 安装目录选择页面
!insertmacro MUI_PAGE_DIRECTORY
; 开始菜单设置页面
var ICONS_GROUP
!define MUI_STARTMENUPAGE_NODISABLE
!define MUI_STARTMENUPAGE_DEFAULTFOLDER "测试系统"
!define MUI_STARTMENUPAGE_REGISTRY_ROOT "${PRODUCT_UNINST_ROOT_KEY}"
!define MUI_STARTMENUPAGE_REGISTRY_KEY "${PRODUCT_UNINST_KEY}"
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "${PRODUCT_STARTMENU_REGVAL}"
!insertmacro MUI_PAGE_STARTMENU Application $ICONS_GROUP
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page
;!define MUI_FINISHPAGE_RUN "$INSTDIR\tomcat6\bin\startup.bat"
!insertmacro MUI_PAGE_FINISH
; Uninstaller pages
!insertmacro MUI_UNPAGE_INSTFILES
; Language files
!insertmacro MUI_LANGUAGE "SimpChinese"
; Reserve files
!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
; ------ MUI 现代界面定义结束 ------
Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "测试系统安装包.exe"
InstallDir "$PROGRAMFILES\testsystem"
InstallDirRegKey HKLM "${PRODUCT_UNINST_KEY}" "UninstallString"
ShowInstDetails show
ShowUnInstDetails show
;定义系统环境变量:CATALINA_HOME
!define CATALINA_HOME "$INSTDIR\tomcat6"
;判断服务器是否已安装JDK
;Section Nil
;SectionEnd
;判断服务器是否已安装JDK入口方法
;Section "JDK"
;Call jdkcheck
;SectionEnd
;禁止多次安装
Section "ismanyInstall"
Call ismanyInstall
SectionEnd
;指定制作EXE安装包源文件的位置 入口方法
Section "gaotest" SEC03
sectionin 1
sectionin RO
SetOutPath "$INSTDIR"
SetOverwrite try
File /r "D:\testExe\*.*"
SectionEnd
;创建快捷方式和调用安装时的系列方法
Section -AdditionalIcons
SetOutPath $INSTDIR
CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\测试系统.lnk" "http://127.0.0.1:8080"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Uninstall.lnk" "$INSTDIR\uninst.exe"
#安装服务
call regExpandStr
call installService
call startService
Call installLnk
SectionEnd
Section -Post
#1 将是否已安装的标记Installed写入注册表中
WriteRegDword HKLM "${PRODUCT_DIR_REGKEY}" "Installed" 1
WriteUninstaller "$INSTDIR\uninst.exe"
WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\tomcat6\bin\startup.bat"
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}" "DisplayIcon" "$INSTDIR\tomcat6\bin\startup.bat"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
SectionEnd
/******************************
* 以下是安装程序的卸载部分 *
******************************/
Section Uninstall
#卸载服务
call un.stopService
call un.uninstService
call un.emptyRegExpandStr
Call un.deleteLnk
!insertmacro MUI_STARTMENU_GETFOLDER "Application" $ICONS_GROUP
Delete "$INSTDIR\${PRODUCT_NAME}.url"
Delete "$INSTDIR\uninst.exe"
Delete "$SMPROGRAMS\$ICONS_GROUP\Uninstall.lnk"
Delete "$SMPROGRAMS\$ICONS_GROUP\测试安装包.lnk"
Delete "$DESKTOP\测试安装包.lnk"
RMDir "$SMPROGRAMS\$ICONS_GROUP"
RMDir /r "$INSTDIR\tomcat6"
RMDir /r "$INSTDIR"
DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
SetAutoClose true
SetAutoClose true
SectionEnd
;设置CATALINA_HOME环境变量
Function "regExpandStr"
SetOverwrite ifnewer
;设置catalina_home
WriteRegExpandStr ${WriteEnvStr_RegKey} "JAVA_HOME" "$INSTDIR\jdk1.7.0"
WriteRegExpandStr ${WriteEnvStr_RegKey} "CATALINA_HOME" "$INSTDIR\tomcat6"
#第一次是使环境变量修改对其他进程有效;刷新环境变量
SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
SetOverwrite on
functionend
#-- 根据 NSIS 脚本编辑规则,所有 Function 区段必须放置在 Section 区段之后编写,以避免安装程序出现未可预知的问题。--#
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
;清空环境变量
Function "un.emptyRegExpandStr"
detailprint "正在删除相关环境变量......."
;设置TOMCAT环境变量CATALINA_HOME
WriteRegExpandStr ${WriteEnvStr_RegKey} "CATALINA_HOME" ""
WriteRegExpandStr ${WriteEnvStr_RegKey} "JAVA_HOME" ""
functionend
;停止服务
Function "un.stopService"
detailprint "正在停止tomcat服务......."
nsExec::Exec 'cmd /c sc stop tomcat6'
detailprint "停止tomcat服务成功......."
functionend
;删除服务
Function "un.uninstService"
detailprint "正在卸载tomcat服务......."
nsExec::Exec 'cmd /c sc delete tomcat6'
detailprint "卸载tomcat服务成功......."
functionend
;删除快捷方式
Function "un.deleteLnk"
RMDir /r "$SMPROGRAMS\${PRODUCT_NAME}"
SetShellVarContext current
Delete "$DESKTOP\${PRODUCT_NAME}.lnk"
FunctionEnd
;注册服务
Function "installService"
SetOutPath "$INSTDIR\tomcat6\bin"
nsExec::Exec 'cmd /c service.bat install tomcat6'
nsExec::Exec 'cmd /c sc config tomcat6 start= auto'
detailprint "install tomcat Service success..."
Sleep 2000
detailprint "install tomcat Service..."
functionend
; 启动服务
Function "startService"
detailprint "start tomcat..."
nsExec::Exec 'cmd /c net start tomcat6'
detailprint "start tomcat success..."
functionend
; 创建开始创建快捷方式
Function "installLnk"
CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\测试系统.lnk" "$INSTDIR\tomcat6\bin\startup.bat"
CreateShortCut "$DESKTOP\测试系统.lnk" "http://127.0.0.1:8080"
FunctionEnd
;判断服务器是否已安装JDK主体方法
Function "jdkcheck"
;为键的句柄创建一个缓存
System::Call "*(i 0) i .R0"
;将要检测的键放入内存中
Push "Software\JavaSoft\Java Development Kit"
;调用API进行检查,返回值在$R1中
system::call 'Advapi32::RegOpenKey(i ${HKEY_LOCAL_MACHINE}, t s, i R0) .iR1'
;关闭该键的句柄
system::call 'Advapi32::RegCloseKey(i R0)'
;释放内存
system::free
;返回值:
;0代表键存在
;2代表键不存在
;其它值表示出错
${If} $R1 == 0
Pop $R1
${ElseIf} $R1 == 2
; Messagebox mb_ok "服务器未安装Java Development Kit,简称JDK,请先安装。"
Pop $R0
; Quit
${Else}
Messagebox mb_ok "Error!"
Quit
${EndIf}
FunctionEnd
;2 禁止多次安装主体方法
Function "ismanyInstall"
;禁止多次安装实例 start
ReadRegDWORD $0 HKLM '${PRODUCT_DIR_REGKEY}' "Installed"
IntCmp $0 +1 +4
MessageBox MB_OK|MB_USERICON '$(^Name) 已安装在计算机中。如需重新安装,请卸载已有的安装。'
Quit
nop
;禁止多次安装实例 end
FunctionEnd
首先要确保tomcat的bin目录下有service.bat文件,这个文件里有许多关于处理tomacat的命令,
首先用编辑器打开service.bat文件,然后在里面修改一下jvm的最大最小内存,然后在
goto end
:installed
后面加上
sc config %SERVICE_NAME%= auto
net start %SERVICE_NAME%
这里的%SERVICE_NAME%是指执行service.bat install [servicename]中的servciename,
然后打开cmd窗口,cd "你安装到的tomcat下的bin目录"
然后执行service.bat install [servicename] 即可
如果是想要在没有jre的环境下的windows中安装,则需要布置JAVA_HOME或者是JRE_HOME,但是有一点需要注意的是在配置过环境变量以后如果卸载的时候是需要将tomcat的环境变量和java的环境变量置为空的。
在这里附上我的代码,写的不好的地方还请指正:
; 该脚本使用 HM VNISEdit 脚本编辑器向导产生
; 安装程序初始定义常量
!define PRODUCT_NAME "测试打包系统"
!define PRODUCT_VERSION "1.0"
!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\${PRODUCT_NAME}.exe"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
!define PRODUCT_STARTMENU_REGVAL "NSIS:StartMenuDir"
; 定义系统环境变量的注册表key值,用于向环境变量CATALINA_HOME里写入安装目录,锁定tomcat
!define WriteEnvStr_RegKey 'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"'
SetCompressor lzma
; MUI 1.67 compatible ------
!include "MUI.nsh"
;定义注册表主键,用于判断服务器是否已安装JDK,有继续安装,无退出安装,(必须带上LogicLib.nsh)
!define HKEY_LOCAL_MACHINE 0x80000002
!include LogicLib.nsh
; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\orange-install.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\orange-uninstall.ico"
; 欢迎页面
!insertmacro MUI_PAGE_WELCOME
; 安装目录选择页面
!insertmacro MUI_PAGE_DIRECTORY
; 开始菜单设置页面
var ICONS_GROUP
!define MUI_STARTMENUPAGE_NODISABLE
!define MUI_STARTMENUPAGE_DEFAULTFOLDER "测试系统"
!define MUI_STARTMENUPAGE_REGISTRY_ROOT "${PRODUCT_UNINST_ROOT_KEY}"
!define MUI_STARTMENUPAGE_REGISTRY_KEY "${PRODUCT_UNINST_KEY}"
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "${PRODUCT_STARTMENU_REGVAL}"
!insertmacro MUI_PAGE_STARTMENU Application $ICONS_GROUP
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page
;!define MUI_FINISHPAGE_RUN "$INSTDIR\tomcat6\bin\startup.bat"
!insertmacro MUI_PAGE_FINISH
; Uninstaller pages
!insertmacro MUI_UNPAGE_INSTFILES
; Language files
!insertmacro MUI_LANGUAGE "SimpChinese"
; Reserve files
!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
; ------ MUI 现代界面定义结束 ------
Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "测试系统安装包.exe"
InstallDir "$PROGRAMFILES\testsystem"
InstallDirRegKey HKLM "${PRODUCT_UNINST_KEY}" "UninstallString"
ShowInstDetails show
ShowUnInstDetails show
;定义系统环境变量:CATALINA_HOME
!define CATALINA_HOME "$INSTDIR\tomcat6"
;判断服务器是否已安装JDK
;Section Nil
;SectionEnd
;判断服务器是否已安装JDK入口方法
;Section "JDK"
;Call jdkcheck
;SectionEnd
;禁止多次安装
Section "ismanyInstall"
Call ismanyInstall
SectionEnd
;指定制作EXE安装包源文件的位置 入口方法
Section "gaotest" SEC03
sectionin 1
sectionin RO
SetOutPath "$INSTDIR"
SetOverwrite try
File /r "D:\testExe\*.*"
SectionEnd
;创建快捷方式和调用安装时的系列方法
Section -AdditionalIcons
SetOutPath $INSTDIR
CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\测试系统.lnk" "http://127.0.0.1:8080"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Uninstall.lnk" "$INSTDIR\uninst.exe"
#安装服务
call regExpandStr
call installService
call startService
Call installLnk
SectionEnd
Section -Post
#1 将是否已安装的标记Installed写入注册表中
WriteRegDword HKLM "${PRODUCT_DIR_REGKEY}" "Installed" 1
WriteUninstaller "$INSTDIR\uninst.exe"
WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\tomcat6\bin\startup.bat"
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}" "DisplayIcon" "$INSTDIR\tomcat6\bin\startup.bat"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
SectionEnd
/******************************
* 以下是安装程序的卸载部分 *
******************************/
Section Uninstall
#卸载服务
call un.stopService
call un.uninstService
call un.emptyRegExpandStr
Call un.deleteLnk
!insertmacro MUI_STARTMENU_GETFOLDER "Application" $ICONS_GROUP
Delete "$INSTDIR\${PRODUCT_NAME}.url"
Delete "$INSTDIR\uninst.exe"
Delete "$SMPROGRAMS\$ICONS_GROUP\Uninstall.lnk"
Delete "$SMPROGRAMS\$ICONS_GROUP\测试安装包.lnk"
Delete "$DESKTOP\测试安装包.lnk"
RMDir "$SMPROGRAMS\$ICONS_GROUP"
RMDir /r "$INSTDIR\tomcat6"
RMDir /r "$INSTDIR"
DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
SetAutoClose true
SetAutoClose true
SectionEnd
;设置CATALINA_HOME环境变量
Function "regExpandStr"
SetOverwrite ifnewer
;设置catalina_home
WriteRegExpandStr ${WriteEnvStr_RegKey} "JAVA_HOME" "$INSTDIR\jdk1.7.0"
WriteRegExpandStr ${WriteEnvStr_RegKey} "CATALINA_HOME" "$INSTDIR\tomcat6"
#第一次是使环境变量修改对其他进程有效;刷新环境变量
SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
SetOverwrite on
functionend
#-- 根据 NSIS 脚本编辑规则,所有 Function 区段必须放置在 Section 区段之后编写,以避免安装程序出现未可预知的问题。--#
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
;清空环境变量
Function "un.emptyRegExpandStr"
detailprint "正在删除相关环境变量......."
;设置TOMCAT环境变量CATALINA_HOME
WriteRegExpandStr ${WriteEnvStr_RegKey} "CATALINA_HOME" ""
WriteRegExpandStr ${WriteEnvStr_RegKey} "JAVA_HOME" ""
functionend
;停止服务
Function "un.stopService"
detailprint "正在停止tomcat服务......."
nsExec::Exec 'cmd /c sc stop tomcat6'
detailprint "停止tomcat服务成功......."
functionend
;删除服务
Function "un.uninstService"
detailprint "正在卸载tomcat服务......."
nsExec::Exec 'cmd /c sc delete tomcat6'
detailprint "卸载tomcat服务成功......."
functionend
;删除快捷方式
Function "un.deleteLnk"
RMDir /r "$SMPROGRAMS\${PRODUCT_NAME}"
SetShellVarContext current
Delete "$DESKTOP\${PRODUCT_NAME}.lnk"
FunctionEnd
;注册服务
Function "installService"
SetOutPath "$INSTDIR\tomcat6\bin"
nsExec::Exec 'cmd /c service.bat install tomcat6'
nsExec::Exec 'cmd /c sc config tomcat6 start= auto'
detailprint "install tomcat Service success..."
Sleep 2000
detailprint "install tomcat Service..."
functionend
; 启动服务
Function "startService"
detailprint "start tomcat..."
nsExec::Exec 'cmd /c net start tomcat6'
detailprint "start tomcat success..."
functionend
; 创建开始创建快捷方式
Function "installLnk"
CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\测试系统.lnk" "$INSTDIR\tomcat6\bin\startup.bat"
CreateShortCut "$DESKTOP\测试系统.lnk" "http://127.0.0.1:8080"
FunctionEnd
;判断服务器是否已安装JDK主体方法
Function "jdkcheck"
;为键的句柄创建一个缓存
System::Call "*(i 0) i .R0"
;将要检测的键放入内存中
Push "Software\JavaSoft\Java Development Kit"
;调用API进行检查,返回值在$R1中
system::call 'Advapi32::RegOpenKey(i ${HKEY_LOCAL_MACHINE}, t s, i R0) .iR1'
;关闭该键的句柄
system::call 'Advapi32::RegCloseKey(i R0)'
;释放内存
system::free
;返回值:
;0代表键存在
;2代表键不存在
;其它值表示出错
${If} $R1 == 0
Pop $R1
${ElseIf} $R1 == 2
; Messagebox mb_ok "服务器未安装Java Development Kit,简称JDK,请先安装。"
Pop $R0
; Quit
${Else}
Messagebox mb_ok "Error!"
Quit
${EndIf}
FunctionEnd
;2 禁止多次安装主体方法
Function "ismanyInstall"
;禁止多次安装实例 start
ReadRegDWORD $0 HKLM '${PRODUCT_DIR_REGKEY}' "Installed"
IntCmp $0 +1 +4
MessageBox MB_OK|MB_USERICON '$(^Name) 已安装在计算机中。如需重新安装,请卸载已有的安装。'
Quit
nop
;禁止多次安装实例 end
FunctionEnd
相关文章推荐
- tomcat 大并发报错 Maximum number of threads (200) created for connector with address null and port 8080
- 自己动手搭建Tomcat下的Servlet
- Tomcat6性能优化
- CentOS下yum安装mysql,jdk以及tomcat
- 关于Tomcat-服务器容器管理
- 同一个tomcat不同项目的session共享问题
- Tomcat7安装配置 for Ubuntu
- eclipse juno与tomcat7配置使用心得
- 关于 tomcat 集群中 session 共享的三种方法
- ubuntu下tomcat开机启动设置
- tomcat共享lib里面的jar包
- tomcat绿色版及安装版修改内存大小的方法
- 成绩查询系统--发布篇--centOS7 tomcat开机启动 + mysql数据库配置
- Solr with Apache Tomcat
- tomcat服务安装为windows服务的方法
- Apache负载均衡请求至Tomcat及DeltaManager的使用
- 安装JDK和Tomcat并配置环境变量
- eclipse启动tomcat无法访问
- Apache + Tomcat +mod_jk 限制域名、IP访问
- nginx后的tomcat获取真实用户ip