2009-10-24 49 views
42

我有一個可執行的JAR文件。是否可以創建該JAR的Windows服務?實際上,我只是想在啓動時運行它,但我不想將該JAR文件放入我的啓動文件夾中,既不在註冊表中。如何從java jar中創建windows服務?

+1

未在註冊表中也?那你爲什麼要把它作爲一項服務? – 2009-10-24 09:17:49

+0

@ o.k.w是正確的,如果你正在創建Windows服務,它會在註冊表中創建條目。 – 2014-09-10 11:28:27

+0

我認爲這個用戶的意思是「作爲服務運行,而不是從啓動註冊表項作爲非服務運行」 – 2016-09-14 13:54:58

回答

6

狸改變許可JSW的前一段時間,如果我是開始的一個項目,我就又用另一個Java服務包裝,http://yajsw.sourceforge.net/即是多了還是少一個模仿JWS的開源實現,然後構建它並進一步改進它。

編輯:我一直在使用YAJSW幾年在幾個platorms(在Windows,Linux版本的幾個...),這是巨大的,發展是持續的。

9

我一直在嘗試與Apache Commons Daemon。它支持Windows(Procrun)和UNIX(Jsvc)。高級安裝程序有一個Java Service tutorial與下載示例項目。如果您將javaservice.jar作爲Windows服務運行,則可以使用「telnet 4444」進行測試。我使用他們的例子,因爲我的重點是讓一個Java的Windows服務運行,而不是寫Java。

+0

對於Windows服務[WinRun4j](http://winrun4j.sourceforge.net/)也是一個不錯的選擇,它可以兼容Java啓動器或服務包裝器 – mcdon 2014-11-07 14:57:42

2

隨着procrun需要prunsrv複製到應用程序目錄(download),並創建一個這樣的INSTALL.BAT:

set PR_PATH=%CD% 
SET PR_SERVICE_NAME=MyService 
SET PR_JAR=MyService.jar 
SET START_CLASS=org.my.Main 
SET START_METHOD=main 
SET STOP_CLASS=java.lang.System 
SET STOP_METHOD=exit 
rem ; separated values 
SET STOP_PARAMS=0 
rem ; separated values 
SET JVM_OPTIONS=-Dapp.home=%PR_PATH% 
prunsrv.exe //IS//%PR_SERVICE_NAME% --Install="%PR_PATH%\prunsrv.exe" --Jvm=auto --Startup=auto --StartMode=jvm --StartClass=%START_CLASS% --StartMethod=%START_METHOD% --StopMode=jvm --StopClass=%STOP_CLASS% --StopMethod=%STOP_METHOD% ++StopParams=%STOP_PARAMS% --Classpath="%PR_PATH%\%PR_JAR%" --DisplayName="%PR_SERVICE_NAME%" ++JvmOptions=%JVM_OPTIONS% 

我冒昧地

  • 來看,這種從同一目錄jar和prunsrv.exe是
  • 該jar有其工作MANIFEST.MF
  • 並且您有關閉掛鉤註冊到JVM(for例如在Spring中使用context.registerShutdownHook())...
  • 不在jar外使用相對路徑(例如log4j應該與一起使用log4j.appender.X.File = $ {app.home}/logs /my.log或東西一樣)

檢查procrun manualthis tutorial以獲取更多信息。

+0

有沒有你可以分享的任何例子? – 2013-06-12 11:29:01

+0

是的:看到上面的那個:-)你還需要什麼? – BTakacs 2013-06-17 09:02:37

+0

感謝BTakacs,我已經檢查過你的教程,它工作正常。但不幸的是,這並沒有解決我想要做的事情..我試圖從C#中實現。 – 2013-06-17 10:13:45

36

我發現這個迄今爲止最簡單的解決方案是Non-Sucking Service Manager

用法是

nssm install <servicename> "C:\Program Files\Java\jre7\java.exe" "-jar <path-to-jar-file>" 
+7

我做了同樣的,它安裝成功,但只要我運行它,它說'意外的狀態SERVICE-PAUSED在迴應開始控制' – aneela 2014-10-23 05:22:52

+0

@kopernik,同樣的事情也發生在我身上..所以請幫助.. – Shakthi 2014-12-18 14:36:55

+0

同樣的問題,你提到。任何想法有什麼不對? – 2015-05-26 08:52:12

9

使用nssm.exe但記得要設置AppDirectory或任何需要的庫或資源將無法訪問。默認情況下,nssm將當前工作目錄設置爲應用程序的java.exe,而不是jar。 所以這樣做是爲了創建一個批處理腳本:

pushd <path-to-jar> 
    nssm.exe install "<service-name>" "<path-to-java.exe>" "-jar <name-of-jar>" 
    nssm.exe set "<service-name>" AppDirectory "<path-to-jar>" 

這應該可以解決服務暫停的問題。

+1

這很好...您應該將它添加爲對kopernik答案的評論。 – 2016-11-29 16:47:59

+0

創建服務後設置AppDirectory在我的情況下失敗。但是你可以用'nssm install '啓動一個GUI,並設置AppDirectory以及其他有用的參數,例如日誌文件,並且一次性創建服務 – JCvanDamme 2017-06-22 16:22:15