2009-10-24 22 views
42

Ho un file JAR eseguibile. È possibile creare un servizio Windows di quel JAR? In realtà, voglio solo eseguirlo all'avvio, ma non voglio mettere quel file JAR nella mia cartella di avvio, né nel registro.Come creare il servizio Windows da jar java?

+1

Non presente anche nel registro?Allora perché lo vorresti come servizio? –

+0

@ o.k.w è giusto se si sta creando il servizio di Windows, creerà la voce nel registro. –

+0

Penso che questo utente intendesse "esegui come servizio, non dalle chiavi del registro di avvio come non servizio" –

risposta

6

Tanuki cambiato la licenza di JSW qualche tempo fa, se ero per iniziare un progetto, vorrei utilizzare Ancora un altro Java Servizio Wrapper, http://yajsw.sourceforge.net/ che è più o meno un'implementazione open source che imita JWS, quindi si basa su di essa e la migliora ulteriormente.

EDIT: Utilizzo YAJSW da diversi anni su diversi platorm (Windows, diversi linux ...) ed è fantastico, lo sviluppo è in corso.

9

Ho sperimentato con Apache Commons Daemon. Supporta windows (Procrun) e unix (Jsvc). Advanced Installer ha un Java Service tutorial con un progetto di esempio da scaricare. Se si ottiene javaservice.jar in esecuzione come servizio Windows, è possibile testarlo utilizzando "telnet 4444". Ho usato il loro esempio perché il mio obiettivo era quello di far funzionare un servizio java windows, non di scrivere java.

+0

Per un servizio Windows [WinRun4j] (http://winrun4j.sourceforge.net/) è anche un buon candidato e può raddoppiare come Java Launcher o Service Wrapper – mcdon

2

Con procrun è necessario copiare prunsrv alla directory dell'applicazione (download), e creare un install.bat come questo:

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% 

ho la presunzione di

  • run questo dalla stessa directory dove jar e prunsrv.exe sono
  • il barattolo ha il suo MANIFEST.MF funzionante
  • e si hanno ganci di arresto registrati in JVM (per esempio con context.registerShutdownHook() in primavera) ...
  • non utilizzando percorsi relativi per file esterni al jar (ad esempio log4j deve essere utilizzato con log4j.appender.X.File = $ {app.home}/logs /my.log o qualcosa di simile)

Controllare la procrun manual e this tutorial per ulteriori informazioni.

+0

c'è qualche esempio che puoi condividere? –

+0

sì: guarda quello sopra :-) di cos'altro hai bisogno? – BTakacs

+0

Grazie a BTakacs, ho già controllato il tuo tutorial e ha funzionato bene. Ma sfortunatamente questo non risolveva ciò che volevo fare .. Sto cercando di ottenerlo ora da C#. –

36

La soluzione più semplice che ho trovato per questo finora è l'utilizzo Non-Sucking Service Manager

sarebbe

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

Ho fatto lo stesso e l'ho installato con successo ma non appena lo eseguo, si dice 'stato imprevisto SERVICE-PAUSED in risposta al controllo START' – aneela

+0

@kopernik, Stessa cosa sta succedendo anche a me..anche aiuto, per favore .. – Shakthi

+0

Questo stesso problema come hai menzionato. Qualche idea su cosa sia sbagliato? –

9

Usa nssm.exe ma ricordatevi di impostare l'AppDirectory o eventuali librerie o le risorse necessarie non saranno accessibili . Di default nssm imposta la directory di lavoro corrente su quella dell'applicazione, java.exe, non sul jar. Quindi, fare questo per creare uno script batch:

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>" 

Questo dovrebbe risolvere il servizio in pausa problema.

+1

Questo va bene ... Dovresti aggiungerlo come commento alla risposta di kopernik. –

+0

Impostazione di AppDirectory dopo la creazione del servizio non riuscita nel mio caso. Ma puoi lanciare un gui con 'nssm install ' e impostare AppDirectory e altri parametri utili come i file di registro e creare il servizio in un colpo solo – JCvanDamme