2
產生

我使用Spring的Gradle啓動插件(org.springframework.boot),生成「一個」罐子一個罐子。它運行良好,當我運行java -jar app.jar - 確實如預期的那樣。但是,此應用程序應該通過JNI使用Apache Commons Daemon作爲守護進程運行。此應用的以前版本建立在自制框架之上,我在守護進程配置中可以指定的主類中有startshutdown方法。如何JNI掛鉤添加到由彈簧引導

我看到Main-Class變爲org.springframework.boot.loader.JarLauncher,它沒有在其中的任何位置實現的startshutdown方法或它的superclasses。有一個launch方法,但我認爲這隻能用於運行與java -jar罐子。

這裏是清單文件(絕密)通過反編譯一個罐子的gradle這個插件和內容生成:

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 

enter image description here

那麼我的問題是:我可以配置此gradle這個插件添加JNI掛鉤方法,以便他們正確運行我的應用程序的主類?我知道有一個Gradle的Shadow插件可以製作「超級」jar,我也可以放棄創建「超級」jar並分發到lib/目錄(這是一個桌面應用程序)。但是,如果Spring Boot開發人員想到了這一點,並且有辦法做到這一點,我寧願使用它。

回答

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的」,我用64位的exe文件在Windows Server上的64位JVM。我在系統下的Windows事件查看器中使用服務用戶發現了一些奇怪的DCOM錯誤,但是重新啓動並確保我的服務用戶對此文件夾擁有修正權限。

+0

謝謝你的回覆@SlaterCodes。我還沒有嘗試這個解決方案。但是,正確關閉應用程序對我們也很重要。我們的解決方案是一個帶有'lib /'文件夾的小jar。以這種方式管理鉤子比較容易,因爲我們可以直接訪問它們,而不需要在超級罐子中使用Spring的JarLauncher。 –

+0

@SergePoele感謝您的注意,我可能會這樣做,當我回到這個時候,讓它更多的生產準備就緒。我只是想答覆,如果有人想讓它至少起作用 – SlaterCodes