nsis打包tomcat,jdk,javaweb

这段时间一直在做一个关于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





  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值