经常由于本地的开发环境和服务器上的生产环境不同,导致项目部署过程中会遇到各种插曲,现在有了jfinal undertow,终于可以摆脱tomcat等各种配置,但是开发环境的JDK和服务器上的JDK版本不一定一致,比如我面临的情况是,开发环境是JDK8,但是生产环境还是JDK6,服务器上有众多依赖于JDK6的项目,还不能轻易更换,以前都是在tomcat中指定JDK版本,现在改用undertow后也想这样,于是在波总的建议下,目前实现方式如下:
将JDK中的jre目录拷贝到项目中来,我是copy到了main目录下,然后在package.xml中增加如下配置
<fileSet> <directory>${basedir}/src/main/jre</directory> <outputDirectory>jre</outputDirectory> </fileSet>
然后在start.bat文件中增加如下配置,让批处理文件不去系统环境中找JDK而是在指定的位置去找
set JAVA_HOME=%APP_BASE_PATH%jre set path=%APP_BASE_PATH%jre/bin
由于我们的服务器是windows环境,所以需要将批处理文件安装成系统服务,便于维护和管理。最后是找到了一个靠谱的小工具叫 nssm (Non-Sucking Service Manager)非依附式系统服务管理工具,支持图形界面和命令行。仅需将nssm.exe和批处理文件放在同一目录下就可以直接使用了。如:
我目前的安装服务脚本如下:
@echo off rem ------------------------------------------------------------------------- rem rem 使用说明: rem rem 1: 修改service name为你期望在系统服务中显示的名称,本例中为 JfinalTest,共4处需要修改 rem rem 2: 编写对服务的具体描述信息,即 Description 后面的内容。共一处需要修改 rem rem ------------------------------------------------------------------------- setlocal & pushd set APP_BASE_PATH=%~dp0 nssm install JfinalTest %APP_BASE_PATH%start.bat nssm set JfinalTest AppDirectory %APP_BASE_PATH% nssm set JfinalTest Description "this is first test for nssm" nssm start JfinalTest endlocal & popd pause
其他删除服务、重启服务、停止服务命令都比较简单,大家可以自行网上找找资料,很多。而且该工具还支持图形界面,也很简单,如下
然后把编写的服务管理的脚本都用maven打包插件在打包时一并copy到部署包中,在服务器上解压后,即可实现一键部署,不用再关心tomcat、不用再关心服务器JDK版本,服务器重启系统也会自动重启,这个小工具还有线程守护,发现服务停掉会自动去尝试重启。是不是很省心。