Domanda

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

È stato utile?

Soluzione

Questo articolo dovrebbe dirti tutto ciò che devi sapere: " Esecuzione di applicazioni Java come servizio di Windows " ; menziona l'utilizzo di " Java Service Wrapper " (esiste un'edizione della community chiamata YAJSW )

Altri suggerimenti

La soluzione più semplice che ho trovato per questo finora è il Manager dei servizi senza succhiare

L'utilizzo sarebbe

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

Utilizzare nssm.exe ma ricordarsi di impostare AppDirectory o eventuali librerie o risorse richieste non saranno accessibili. Per impostazione predefinita, nssm imposta la directory di lavoro corrente su quella dell'applicazione, java.exe, non sul vaso. Quindi, fai 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 problema di pausa del servizio.

Ho sperimentato Apache Commons Daemon . Supporta windows ( Procrun ) e unix ( Jsvc ). Advanced Installer ha un Tutorial del servizio Java con un progetto di esempio scaricare. Se ottieni il loro javaservice.jar in esecuzione come servizio di Windows, puoi provarlo 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.

Tanuki ha cambiato la licenza di jsw qualche tempo fa, se avessi iniziato un progetto, avrei usato Yet Another Java Service Wrapper, http://yajsw.sourceforge.net/ che è più o meno un'implementazione open source che imita JWS, quindi si basa su di esso e lo migliora ulteriormente.

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

Con procrun devi copiare il prunsrv nella directory dell'applicazione ( download ) e crea un file 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%

Presumo di

  • eseguilo dalla stessa directory in cui si trova il jar e il prunsrv.exe
  • il vaso ha il suo MANIFEST.MF funzionante
  • e hai hook di arresto registrati in JVM (ad esempio con context.registerShutdownHook () in primavera) ...
  • non usando percorsi relativi per file esterni al vaso (ad esempio log4j dovrebbe essere usato con log4j.appender.X.File = $ {app.home} /logs/my.log o qualcosa di simile )

Controlla il procrun manuale e questo tutorial per ulteriori informazioni.

Usiamo il Tanuki Service Wrapper per questo. È molto configurabile.

Un'altra opzione è winsw: https://github.com/kohsuke/winsw/

Configura un file xml per specificare il nome del servizio, cosa eseguire, eventuali argomenti ecc. E usa l'exe per installare. Esempio xml: https://github.com/kohsuke/winsw/tree/master/examples

Preferisco questo a nssm, perché è un exe leggero; e il file di configurazione xml è facile da condividere / eseguire il commit nel codice sorgente.

PS il servizio è installato eseguendo installazione your-service.exe

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top