jfinal undertow项目再集成JDK,一键安装系统服务,让部署再快一点

       经常由于本地的开发环境和服务器上的生产环境不同,导致项目部署过程中会遇到各种插曲,现在有了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和批处理文件放在同一目录下就可以直接使用了。如:

image.png

我目前的安装服务脚本如下:

@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


其他删除服务、重启服务、停止服务命令都比较简单,大家可以自行网上找找资料,很多。而且该工具还支持图形界面,也很简单,如下

1207100-20180329160115318-512703640.png

然后把编写的服务管理的脚本都用maven打包插件在打包时一并copy到部署包中,在服务器上解压后,即可实现一键部署,不用再关心tomcat、不用再关心服务器JDK版本,服务器重启系统也会自动重启,这个小工具还有线程守护,发现服务停掉会自动去尝试重启。是不是很省心。

评论区

JFinal

2018-12-14 12:42

这个功能好多人在提需求了,楼主动作超快,解决方案也十分简洁,收藏加点赞

北流家园网

2018-12-14 19:35

看不明白

杜福忠

2018-12-14 20:59

收藏~ 以后遇到windows服务器的客户可以用这招!

liugz

2018-12-15 11:08

之前网上找了好几个工具都无法启动服务。
刚试用了下nssm这个工具,可以启动了,但页面无法访问。
是在http://www.nssm.cc/download这里下载的2.24版本,是不是哪里姿势不对?

liugz

2018-12-15 11:45

谢谢。解决了,原来是每个项目中start.bat文件中需要单独设置下java环境。
只是这个工具会被杀毒软件报木马毒,不知是否真的安全。

JFinal

2018-12-15 16:39

@liugz 一定要去官网下载,否则被植入木马的可能性很大,被杀毒软件报木马要关注

linee

2018-12-17 18:33

这个如何使用啊,这里提示Administrator access is needed to install a service.
Can't open service!
OpenService(): 拒绝访问。

欲风217

2019-01-16 13:48

这种方式把 jre 也嵌入到项目中了,jre8 近 200MB,增大了项目体积。可以把 jre8 单独传到服务器上,只在 start.bat 文件中增加 set JAVA_HOME=具体 jre 路径
set path=具体 jre 路径/bin 就可以了吧。

ethan_shy

2019-01-16 14:21

@欲风217 当然可以,如果同一个服务器,不用每次都传

happyboy

2019-01-23 11:14

@linee 你需要用管理员权限运行

happyboy

2019-01-23 11:15

其实可以服务化的工具有好多,这个可视化的工具还是第一次听说。^_^

happyboy

2019-01-23 11:18

@liugz 其实也可以不设置,如果不指定,默认使用操作系统的环境。

wangerxiao

2019-01-24 15:21

感谢已解决问题

osril

2019-02-18 17:14

linux 下除了wrapper还有哪些?

JFinal

2019-02-18 17:42

@osril 用最新版本的 undertow.sh 脚本,在此下载:
https://gitee.com/jfinal/jfinal-undertow/blob/master/undertow.sh

osril

2019-02-19 11:46

angelfly438

2019-03-24 20:13

不错,部署成功,太好了!

lubin

2019-04-30 11:35

dos中控制台输出在哪里设置

没牙的小朋友

2019-11-19 08:03

我这边部署jre,提示tools.jar在classpath中找不到

JFinal

2019-11-19 11:41

@没牙的小朋友 JRE 部署,使用下面的配置:
me.setToCglibProxyFactory();

文档中有过说明:
https://www.jfinal.com/doc/4-8

dragon688

2020-02-21 17:19

有个问题,这样的话如何区分windows系统是32位还是64位,nssm区分

dragon688

2020-03-06 16:33

这个如何使用啊,这里提示Administrator access is needed to install a service.
Can't open service!
OpenService(): 拒绝访问。有知道咋么处理的吗