0
点赞
收藏
分享

微信扫一扫

Grails 项目打包作为Windows 服务启动

七千22 2022-01-14 阅读 93

本文档可实现目的:

  1.  grails 项目打包好的war包作为Windows 服务在系统 下运行
  2.  部署完成后支持默认设置开机自启
  3.  支持32位和64位JDK
  4. 实现一键安装服务
  5. 支持一键卸载服务
  6. 支持一键重启服务
  7. 支持一键停止服务
  8. 支持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了。

八:写了三个小时,终于写完了。有问题可以留言给我,我可能马上看到,也可能一年后看到。

举报

相关推荐

0 条评论