本文档可实现目的:
- grails 项目打包好的war包作为Windows 服务在系统 下运行
- 部署完成后支持默认设置开机自启
- 支持32位和64位JDK
- 实现一键安装服务
- 支持一键卸载服务
- 支持一键重启服务
- 支持一键停止服务
- 支持yml外置配置文件修改环境变量
系统环境:
正文:
一:创建服务安装脚本
方案一:(此脚本使用独立JDK,不需要为系统配置JDK环境变量)
1. 新建txt文件,文件名称 “服务安装”
2. 将.txt后缀修改为.bat
3. 粘贴如下脚本内容
@echo off
rem 本脚本负责安装grails-service-0.1.war为系统服务,脚本依赖Procrun
rem 运行脚本前请务必将procrun.exe文件放入和脚本同一个目录下
rem 设置jdk 所在目录,推荐将JDK免安装包与此安装脚本放置到同一目录下
SET JAVA_HOME=".\JDK8-32\jre"
: install_service
if "%JAVA_HOME%" == "" (
echo 找不到JRE,未拷贝JDK-32文件包到当前文件所在目录,请拷贝。。。。。
goto failed
) else (
"%JAVA_HOME%\bin\java" -version 2>&1 | find /i "build 1.8.0" > nul 2>&1
if %ERRORLEVEL% NEQ 0 (
echo 必须使用java8环境,请检查所使用JDK版本。
goto failed
)
)
if exist "%JAVA_HOME%\jre" (
set "JRE_HOME=%JAVA_HOME%\jre"
) else (
set "JRE_HOME=%JAVA_HOME%"
)
rem Try to use the server jvm
set "JVM=%JRE_HOME%\bin\server\jvm.dll"
if exist "%JVM%" goto foundJvm
rem Try to use the client jvm
set "JVM=%JRE_HOME%\bin\client\jvm.dll"
if exist "%JVM%" goto foundJvm
echo Warning: Neither 'server' nor 'client' jvm.dll was found at JRE_HOME.
set JVM=auto
:foundJvm
cd /d %~dp0
set "SERVICE_PATH=%cd%"
echo 使用JAVA_HOME变量值: %JAVA_HOME%
prunsrv.exe install grails-service ^
--Description "grails-server 测试服务,服务自动重启哦" ^
--Startup auto ^
--StartMode jvm ^
--StopMode jvm ^
--Jvm "%JVM%" ^
--Classpath "%SERVICE_PATH%\grails-service-0.1.war" ^
--StartClass "org.springframework.boot.loader.WarLauncher" ^
--StopClass "java.lang.System"^
--LogPath "./"^
--StopMethod "exit"^
if %ERRORLEVEL% NEQ 0 goto failed
sc failure "grails-service" actions= restart/5000/restart/5000/restart/5000 reset= 86400
if %ERRORLEVEL% NEQ 0 (
echo 设置服务自动重启失败,请确保使用管理员身份运行脚本
goto :failed
)
:start_service
echo 尝试启动service...
prunsrv.exe start grails-service
if %ERRORLEVEL% NEQ 0 (
echo 服务启动失败,请检测终端输出或相关日志定位问题
) else (
goto :EOF
)
:failed
echo 安装失败,请检查终端上输出的错误信息,以及相关日志,修复问题后重新运行。
pause
方案二: (此脚本使用系统默认环境变量,需要事先配置好JDK环境变量,与方案已二选一即可)
1. 新建txt文件,文件名称 “服务安装”
2. 将.txt后缀修改为.bat
3. 粘贴如下脚本内容
@echo off
rem 本脚本负责安装grails-service-0.1.war为系统服务,脚本依赖Procrun
rem 运行脚本前请务必将procrun.exe文件放入和脚本同一个目录下
rem 查找windows 系统环境变量中JDK
if "%JAVA_HOME%" == "" (
for %%I in ("HKLM\SOFTWARE\JavaSoft\Java Runtime Environment\1.8",
"HKLM\SOFTWARE\Wow6432Node\JavaSoft\Java Runtime Environment\1.8") do (
reg query %%I /v "JavaHome" > nul 2>&1
if %ERRORLEVEL% EQU 0 (
for /f "tokens=1,2*" %%i in ('reg query %%I ^| find /i "JavaHome"') do (
SET JAVA_HOME=%%k
)
goto install_service
)
)
)
: install_service
if "%JAVA_HOME%" == "" (
echo 找不到JDK或JRE,请检查系统JDK环境变量安装于配置是否正确
goto failed
) else (
"%JAVA_HOME%\bin\java" -version 2>&1 | find /i "build 1.8.0" > nul 2>&1
if %ERRORLEVEL% NEQ 0 (
echo 必须使用java8环境,请检查所使用JDK版本。
goto failed
)
)
if exist "%JAVA_HOME%\jre" (
set "JRE_HOME=%JAVA_HOME%\jre"
) else (
set "JRE_HOME=%JAVA_HOME%"
)
rem Try to use the server jvm
set "JVM=%JRE_HOME%\bin\server\jvm.dll"
if exist "%JVM%" goto foundJvm
rem Try to use the client jvm
set "JVM=%JRE_HOME%\bin\client\jvm.dll"
if exist "%JVM%" goto foundJvm
echo Warning: Neither 'server' nor 'client' jvm.dll was found at JRE_HOME.
set JVM=auto
:foundJvm
cd /d %~dp0
set "SERVICE_PATH=%cd%"
echo 使用JAVA_HOME变量值: %JAVA_HOME%
prunsrv.exe install grails-service ^
--Description "grails-server 测试服务,服务自动重启哦" ^
--Startup auto ^
--StartMode jvm ^
--StopMode jvm ^
--Jvm "%JVM%" ^
--Classpath "%SERVICE_PATH%\grails-service-0.1.war" ^
--StartClass "org.springframework.boot.loader.WarLauncher" ^
--StopClass "java.lang.System"^
--LogPath "./"^
--StopMethod "exit"^
if %ERRORLEVEL% NEQ 0 goto failed
sc failure "grails-service" actions= restart/5000/restart/5000/restart/5000 reset= 86400
if %ERRORLEVEL% NEQ 0 (
echo 设置服务自动重启失败,请确保使用管理员身份运行脚本
goto :failed
)
:start_service
echo 尝试启动service...
prunsrv.exe start grails-service
if %ERRORLEVEL% NEQ 0 (
echo 服务启动失败,请检测终端输出或相关日志定位问题
) else (
goto :EOF
)
:failed
echo 安装失败,请检查终端上输出的错误信息,以及相关日志,修复问题后重新运行。
pause
二:创建服务停止脚本
1. 新建txt文件,文件名称 “服务停止”
2. 将.txt后缀修改为.bat
3. 粘贴如下脚本内容
@net stop grails-service
三:创建服务卸载脚本
1. 新建txt文件,文件名称 “服务卸载”
2. 将.txt后缀修改为.bat
3. 粘贴如下脚本内容
@echo off
cd /d %~dp0
prunsrv.exe delete grails-service
四:创建服务重启脚本
1. 新建txt文件,文件名称 “服务重启”
2. 将.txt后缀修改为.bat
3. 粘贴如下脚本内容
@net stop grails-service
@net start grails-service
五:下载
prunsrv.exe
下载地址:
https://downloads.apache.org/commons/daemon/binaries/windows/commons-daemon-1.2.4-bin-windows.zip
下载完成后解压缩
六:创建服务安装文件夹,拷贝相关文件
1. grails-services 文件夹(最好别用中文名称名字可以自己起,至于会不会出错,鄙人没试过,会不会出现啥奇葩错误寡人也不晓得)
2. 拷贝 prunsrv.exe,服务安装.bat,服务停止.bat,服务卸载.bat,服务重启.bat,grails-service-0.1.war 六个文件。如果使用独立JDK,则把JDK免安装包放置到此目录下,使用系统环境变量则忽略拷贝JDK这一步。
3. 以管理员身份运行服务安装服务安装.bat,如果不报错,那么恭喜你成功了,你可以凑合使用了。
至此,grails 打包好后的war包即可实现前七个目的,如果,以上脚本需要修改的地方并不多,总结下需要修改如下几个内容:
1. 如果不使用系统自带JDK,则需要使用方案一中第6行JDK路径
2. 修改所有脚本中grails-service 名称为你自己的脚本名称
3. 将安装脚本 --Classpath 后的 grails-service-0.1.war 替换为你自己打包好的war名称
七:咱不是凑合的人,系统部署后,不能灵活修改环境变量配置,这么恶心的事咱不允许,在每次打包时进行修改,修改完后再打包,那种事咱不弄。话不多说,进入正题。
1. 创建EnvironmentConfig.groovy
2. 新建 spring.factories 文件
文件内容:
org.springframework.boot.env.EnvironmentPostProcessor=grails.service.EnvironmentConfig
其中EnvironmentConfig.groovy 名称与路径要要与上面创建的创建EnvironmentConfig.groovy 包路径和名称一致
3. 修改yml文件中服务端号进行测试(其他内容都是创建grails项目后默认的,最后两行是测试新加)
---
grails:
profile: web
codegen:
defaultPackage: grails.service
spring:
transactionManagement:
proxies: false
gorm:
reactor:
# Whether to translate GORM events into Reactor events
# Disabled by default for performance reasons
events: false
info:
app:
name: '@info.app.name@'
version: '@info.app.version@'
grailsVersion: '@info.app.grailsVersion@'
spring:
main:
banner-mode: "off"
groovy:
template:
check-template-location: false
# Spring Actuator Endpoints are Disabled by Default
endpoints:
enabled: false
jmx:
enabled: true
---
grails:
mime:
disable:
accept:
header:
userAgents:
- Gecko
- WebKit
- Presto
- Trident
types:
all: '*/*'
atom: application/atom+xml
css: text/css
csv: text/csv
form: application/x-www-form-urlencoded
html:
- text/html
- application/xhtml+xml
js: text/javascript
json:
- application/json
- text/json
multipartForm: multipart/form-data
pdf: application/pdf
rss: application/rss+xml
text: text/plain
hal:
- application/hal+json
- application/hal+xml
xml:
- text/xml
- application/xml
urlmapping:
cache:
maxsize: 1000
controllers:
defaultScope: singleton
converters:
encoding: UTF-8
views:
default:
codec: html
gsp:
encoding: UTF-8
htmlcodec: xml
codecs:
expression: html
scriptlets: html
taglib: none
staticparts: none
endpoints:
jmx:
unique-names: true
---
hibernate:
cache:
queries: false
use_second_level_cache: false
use_query_cache: false
dataSource:
pooled: true
jmxExport: true
driverClassName: org.h2.Driver
username: sa
password: ''
environments:
development:
dataSource:
dbCreate: create-drop
url: jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE
test:
dataSource:
dbCreate: update
url: jdbc:h2:mem:testDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE
production:
dataSource:
dbCreate: none
url: jdbc:h2:./prodDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE
properties:
jmxEnabled: true
initialSize: 5
maxActive: 50
minIdle: 5
maxIdle: 25
maxWait: 10000
maxAge: 600000
timeBetweenEvictionRunsMillis: 5000
minEvictableIdleTimeMillis: 60000
validationQuery: SELECT 1
validationQueryTimeout: 3
validationInterval: 15000
testOnBorrow: true
testWhileIdle: true
testOnReturn: false
jdbcInterceptors: ConnectionState
defaultTransactionIsolation: 2 # TRANSACTION_READ_COMMITTED
server:
port: 8090
3. 停止服务,拷贝 application.yml 文件以及打包好的grails-service-0.1.war 到grails-service文件夹,然后重启服务,如果不所料,服务端口号已变成8090了。