2

我正在使用 Spring Boot gradle 插件 ( org.springframework.boot) 来生成“一个”jar。当我跑步时它运行良好java -jar app.jar- 完全符合预期。但是,该应用程序应该通过 JNI 使用 Apache Commons Daemon 作为守护程序运行。这个应用程序的早期版本是建立在自制框架之上的,我在主类中有方法,我可以在守护进程配置中指定startshutdown

我看到 Main-Class 变成org.springframework.boot.loader.JarLauncher了,它没有在它的任何地方实现startshutdown方法,或者它的超类。有一种launch方法,但我认为这只能用于运行 jar java -jar

这是由 gradle 插件生成的清单文件(已编辑)和反编译的一个 jar 的内容:

Manifest-Version: 1.0
Start-Class: com.company.myapp.Application
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Version: 1.5.6.RELEASE
Main-Class: org.springframework.boot.loader.JarLauncher

在此处输入图像描述

那么我的问题是:我可以配置这个 gradle 插件来添加 JNI 钩子方法,以便它们正确运行我的应用程序的主类吗?我知道有一个用于 Gradle 的 Shadow 插件来制作“uber”jar,我也可以放弃创建“uber”jar 并在lib/目录中分发(它是一个桌面应用程序)。但是,如果 Spring Boot 开发人员考虑过它并且有办法做到这一点,我宁愿使用它。

4

1 回答 1

0

所以我正在使用StartMode=Java而不是jvm它似乎工作正常。唯一的问题是我不认为 Spring Boot 会优雅地关闭,但我现在可以忍受。

MyApp.exe //IS//MyApp --Install="C:\appData\Programs\MyApp\MyApp.exe" ^
 --Startup=auto --StartMode=Java ^
 --JavaHome="C:\appData\Programs\Java" ^
 --Classpath="C:\appData\Programs\MyApp\MyApp.jar" ^
 --StartClass="org.springframework.boot.loader.JarLauncher" ^
 --ServiceUser="MyAppUser --ServicePassword="xxxxxx" ^
 --LogPath="C:\appData\Programs\MyApp\logs" ^
 --StartPath="C:\appData\Data\MyApp" ^
 --StopTimeout=30

我重命名了 exe 文件以匹配我的应用程序名称“MyApp”,并在 Windows Server 上使用 64 位 exe 和 64 位 JVM。我在系统下的 Windows 事件查看器中的服务用户遇到了一些奇怪的 DCOM 错误,但是重新启动了几次并确保我的服务用户对此文件夹具有权限修复了它。

于 2017-12-13T00:47:32.760 回答