有一个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