有一个Web Application是在Tomcat6上构建的,要部署到Windows平台上,需要制作一个安装程序,以方便用户安装。
安装程序的主要目标是:用一个安装程序安装Java运行环境、Tomcat以及Web Application;修改Tomcat配置文件将应用加入网站,安装并启动Windows下的Tomcat服务。达到用一个安装程序在一台新装的Windows操作系统上部署整个Web应用的目的。安装程序使用NSIS建立,其安装脚本的关键点如下:
1、Tomcat6在Windows下服务的安装
从网上资料所见的有下面两个方法:
方法1:
nsExec::Exec " cmd /C service install "
ExecWait " sc config Tomcat6 start= auto "
方法2:
ExecWait " service.bat install "
ExecWait " sc config Tomcat6 start= auto "
在参考Tomcat网站上的手册后发现,使用tomcat6.exe执行程序也可以安装服务。
方法3:
ExecWait ' tomcat6 //IS//Tomcat6 --DisplayName="Apache Tomcat 6" \
-- Install = " $INSTDIR\Tomcat\bin\tomcat6.exe " -- Jvm = " $INSTDIR\jre6\bin\server\jvm.dll " \
-- StartMode = jvm -- StopMode = jvm -- Startup = auto -- StartClass = org.apache.catalina.startup.Bootstrap -- StartParams = start -- StopClass = org.apache.catalina.startup.Bootstrap -- StopParams = stop \
-- LogPath = $INSTDIR\Tomcat\logs -- Classpath = $INSTDIR\Tomcat\bin\bootstrap.jar \
-- JvmOptions =- Dcatalina. base = $INSTDIR\Tomcat; - Dcatalina.home = $INSTDIR\Tomcat; - Djava.endorsed.dirs = $INSTDIR\Tomcat\endorsed; - Djava.io.tmpdir = $INSTDIR\Tomcat\temp; - Djava.util.logging.manager = org.apache.juli.ClassLoaderLogManager; - Djava.util.logging.config.file = $INSTDIR\Tomcat\conf\logging.properties; '
其中方法3在安装程序运行时正确率更高些,而方法1和方法2有时会出现服务不能安装的情况。
2、Tomcat6服务安装完毕后首次不能启动
Tomcat6服务安装完毕后如果不重新启动计算机而启动服务的话,将会出错,导致服务无法启动。检查log文件,发现是jvm.dll文件加载出错而导致java虚拟机无法启动,上网查资料,原来是新版本(1.6)的jvm.dll启动时要加载微软动态库msvcr71.dll,由于系统在当前的搜索路径中无法找到msvcr71.dll文件而出错,该文件随jdk6、jre6提供,在相应的bin目录下,但即使安装程序将jre\bin目录加入path环境变量也无济于事,好像jvm.dll只认windows启动时的系统路径,而对本次windows系统启动后新加入的path变量不予承认(不知哪位高手能代为剖析其中原因)。解决的办法是将msvcr71.dll拷贝到jre\bin\server目录下和jvm.dll放在一起,或是拷贝到windows系统目录下都可以。
3、Tomcat6不要求非要安装jdk,安装jre也可以,而Tomcat6以前版本则不行。
4、修改Tomcat配置文件server.xml
修改配置文件要涉及到xml文件的读写,需要使用NSIS的xml插件,可以在此下载。
下面的实例脚本在server.xml中增加一个站点context,把我们自己的web应用加进去。
${xml::LoadFile} " $INSTDIR\tomcat\conf\server.xml " $ 0
${xml::CreateNode} " <Context></Context> " $R0
${xml::GotoPath} " /Server/Service/Engine/Host " $ 0
${xml::InsertEndChild} " $R0 " $ 0
${xml::GotoPath} " /Server/Service/Engine/Host/Context " $ 0
${xml::SetAttribute} " path " " /myapp " $ 0
${xml::SetAttribute} " reloadable " " true " $ 0
${xml::SetAttribute} " docBase " " $INSTDIR\myweb " $ 0
${xml::SetAttribute} " debug " " 0 " $ 0
${xml::SaveFile} " $INSTDIR\tomcat\conf\server.xml " $ 0
FunctionEnd