【问题标题】:How to add JNI hooks to one jar generated by Spring Boot如何将 JNI 钩子添加到 Spring Boot 生成的一个 jar 中
【发布时间】:2018-02-10 17:55:54
【问题描述】:

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

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

这里是gradle插件生成的manifest文件(已编辑)和反编译的一个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 开发人员考虑过并且有办法做到这一点,我宁愿使用它。

【问题讨论】:

    标签: java spring-boot jar spring-boot-gradle-plugin apache-commons-daemon


    【解决方案1】:

    所以我使用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 错误,但是重新启动了几次并确保我的服务用户对该文件夹具有权限修复了它。

    【讨论】:

    • 感谢@SlaterCodes 的回复。我还没有尝试过这个解决方案。但是,正确关闭应用程序对我们也很重要。我们采用的解决方案是一个带有lib/ 文件夹的小罐子。以这种方式管理钩子更容易,因为我们可以直接访问它们而无需 Spring 的 JarLauncher 在 uber jar 中。
    • @SergePoele 感谢您的注意,当我回来准备更多生产时,我可能也会这样做。我只是想回复一下,以防有人想至少让它发挥作用
    猜你喜欢
    • 2020-10-18
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    • 2021-12-31
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    相关资源
    最近更新 更多