Come creare un servizio Windows dall'app Java


220

Ho appena ereditato un'applicazione Java che deve essere installata come servizio su XP e Vista. Sono passati circa 8 anni da quando ho usato Windows in qualsiasi forma e non ho mai dovuto creare un servizio, figuriamoci da qualcosa come un'app Java (ho un barattolo per l'app e un barattolo singola dipendenza - log4j ). Qual è la magia necessaria per far funzionare questo servizio? Ho la fonte, quindi sono possibili modifiche al codice, anche se preferibilmente evitate.



1
Solo per completezza: qui serverfault.com/a/259195 afferma che l'app deve rispondere ai callback di Service Control Manager. Leggi questo tutorial che utilizza Procrun ticklingmind.blogspot.com/2010/03/…
Broken_Window

Risposte:


69

Ho avuto un po 'di fortuna con Java Service Wrapper


11
Java Service Wrapper sembra molto utile. Ma ho dato un'occhiata all'elenco delle funzionalità. Dovrai solo essere consapevole che la versione della community non è autorizzata per l'uso sul server.
Brian Matthews,

Questo potrebbe essere un problema. È stato qualche anno fa che l'ho usato. Immagino che abbiano deciso di caricare.
sblundy,

Questo wrapper è utilizzato da molti progetti open source, inclusi molti su Jakarta Apache, come ActiveMQ.
Todd,

7
wrapper.tanukisoftware.org/doc/english/licenseCommunity.html Uso a fonte chiusa La GPL non impedisce lo sviluppo di software privato per uso interno che dipende dal software sotto GPL a condizione che tale software non sia mai distribuito senza fare la fonte completa di l'intera applicazione disponibile per tutti gli utenti. Mentre incoraggiamo gli utenti aziendali e governativi a fare uso di un server o di un Accordo di licenza di sviluppo, l'accordo di licenza della comunità è accettabile purché l'applicazione sia per uso interno o sarà sempre distribuita insieme al suo pieno src.
Vladimir,

1
@Vladimir tanuki wrapper non è più open source per arco a 64 bit
gerrytan,

100

Apache Commons Daemon è una buona alternativa. Ha Procrun per i servizi di Windows e Jsvc per i demoni unix. Utilizza una licenza Apache meno restrittiva e Apache Tomcat la utilizza come parte di se stessa per essere eseguita su Windows e Linux! Per farlo funzionare è un po 'complicato, ma c'è un articolo esauriente con un esempio funzionante.

Oltre a ciò, puoi guardare bin \ service.bat in Apache Tomcat per avere un'idea di come impostare il servizio. In Tomcat rinominano i file binari Procrun (prunsrv.exe -> tomcat6.exe, prunmgr.exe -> tomcat6w.exe).

Qualcosa con cui ho lottato con Procrun, i tuoi metodi start e stop devono accettare i parametri (String [] argv). Ad esempio "start (String [] argv)" e "stop (String [] argv)" funzionerebbero, ma "start ()" e "stop ()" causerebbero errori. Se non riesci a modificare quelle chiamate, prendi in considerazione l'idea di creare una classe bootstrapper in grado di massaggiare quelle chiamate in base alle tue esigenze.


Usando la riflessione, potresti probabilmente aggirare il problema che hai indicato nel tuo ultimo paragrafo. Inoltre, il demone commons apache è l'unico wrapper che conosco che ha binari a 64 bit preconfigurati per l'uso gratuito.
Djangofan,

È necessario un ritorno a capo tra ciascuna Opzioni JVM. Ad esempio, se hai sulla stessa riga -Dopt1 = a -Dopt2 = b, potrebbe non funzionare. Per risolverlo devi scrivere --JvmOptions=-Dopt=a#-Dopt2=b. Stavo eseguendo il comando da uno script di formica e ho lottato per giorni per questo. Spero che sia d'aiuto.
Sydney,

L'articolo di cui hai parlato non esiste più ... Hai ancora un modo per arrivarci? Sto riscontrando problemi nel far sì che Apache Commons Daemon faccia ciò di cui ho bisogno.
11101101b,

3
@ 11101101b, Apache sembra aver attaccato l'intestino dell'articolo alla sua pagina wiki ...
Lucas,

@community wiki, ho usato Apache Commons Daemon per macchine Windows a 64 bit, ha aggiunto il servizio con successo. mentre sto usando gli stessi processi per la macchina Windows 7 a 32 bit non riesce ad aggiungere il servizio.
Shakthi,

59

Con Apache Commons Daemon ora puoi avere un nome e un'icona eseguibili personalizzati! Puoi anche ottenere un monitor della barra delle applicazioni personalizzato con il tuo nome e icona!

Ora ho il mio servizio in esecuzione con il mio nome e icona (prunsrv.exe), e anche il monitor della barra delle applicazioni (prunmgr.exe) ha il mio nome e icona personalizzati!

  1. Scarica i binari del demone Apache Commons (avrai bisogno di prunsrv.exe e prunmgr.exe).
  2. Rinominali in modo che siano MyServiceName.exee MyServiceNamew.exerispettivamente.
  3. Scarica WinRun4J e usa il RCEDIT.exeprogramma fornito con esso per modificare l'eseguibile di Apache per incorporare la tua icona personalizzata in questo modo:

    > RCEDIT.exe /I MyServiceName.exe customIcon.ico
    > RCEDIT.exe /I MyServiceNamew.exe customTrayIcon.ico
  4. Ora installa il tuo servizio Windows in questo modo (vedi la documentazione per maggiori dettagli e opzioni):

    > MyServiceName.exe //IS//MyServiceName \
      --Install="C:\path-to\MyServiceName.exe" \
      --Jvm=auto --Startup=auto --StartMode=jvm \
      --Classpath="C:\path-to\MyJarWithClassWithMainMethod.jar" \
      --StartClass=com.mydomain.MyClassWithMainMethod
  5. Ora hai un servizio Windows del tuo Jar che verrà eseguito con la tua icona e il tuo nome! Puoi anche avviare il file monitor e verrà eseguito nella barra delle applicazioni con la tua icona e il tuo nome.


1
Ho fatto tutto secondo il tuo How to, ma non cambia l'icona del systray ... hai idea del perché?
outofBounds

Mi dispiace @outofBounds, non ho visto il tuo commento fino a ora. Il programma RCEDIT.exe è ciò che modifica l'icona dell'eseguibile del servizio. Assicurarsi di disporre di un file .ico valido con ciascuna dimensione definita correttamente. Si può vedere come creare un file ico corretta qui: stackoverflow.com/questions/4354617/...
11101101b

2
Solo per questo sai, non puoi avere spazi nel nome del servizio.
11101101b

1
Sì @Shakthi funziona benissimo su Windows XP a 32 e 64 bit, 7, 8, 8.1, Server 2003, 2008 e 2012.
11101101b

1
Sì, @Syamsoul Azrein, funziona alla grande su 10 e su qualsiasi edizione server.
11101101b

31

Un modo semplice è il Wrapper Wrapper NSSM ( vedi il mio blog ).


7
NSSM ROCKS! Faccio facilmente wrapper anche dal mio programma Java. Facile, leggero, funziona - 100kb di felicità! Grazie!
cynepnaxa,

1
Qualche esempio, come utilizzare NSSM Wrapper per avviare l'istanza dell'app Java (sto usando HelioSearch) come servizio di Windows in background all'avvio del sistema?
Krunal

@GiordanoMaestro il tuo post sul blog non è più accessibile. Hai un altro link?
Matthieu

2
Rispetto ad Apache Commons Daemon, wrapper.tanukisoftware.org e yajsw, NSSM è stata di gran lunga l'opzione più rapida e semplice per trasformare una semplice app Java in un servizio Windows
Jeffrey Knight

Sto cercando di utilizzare NSSM per eseguire il mio jar eseguibile di avvio a molla. Ho ricevuto questo errore, "Stato imprevisto SERVICE_PAUSED in risposta al controllo START".
Kiran Kumar,

26

Un'altra opzione è WinRun4J . Questo è un launcher java configurabile che funge anche da host del servizio Windows (entrambe le versioni a 32 e 64 bit). È open source e non ci sono restrizioni al suo utilizzo.

(divulgazione completa: lavoro su questo progetto).


3
Grazie per questo. Ho provato YAJWS e prima mi ha spaventato con il download da 19 MB, e dopo aver seguito le istruzioni ha mostrato "errore durante l'analisi della riga di comando". Ho visto PROCRUN ed è troppo ingombrante per una configurazione rapida. INSTSRV / SRVANY richiede modifiche al registro! Launch4J racchiude un JAR all'interno di un EXE, complicando così le distribuzioni. WinRun4J era una misura perfetta. L'unico inconveniente è che richiede una classe speciale per lavorare come servizio (invece di chiamare semplicemente la classe principale standard). Ma nel complesso è perfetto al 99%.
fernacolo,

2
Cordiali saluti, l'ultima versione ha un wrapper per una classe principale standard.
Peter Smith,

Ciao, puoi fare qualche esempio che spiega come usarlo? Vorrei usarlo per avviare l'istanza di HelioSearch come servizio Windows in background all'avvio del sistema.
Krunal

17

Ancora un'altra risposta è Yet Another Java Service Wrapper , questa sembra una buona alternativa a Java Service Wrapper in quanto ha una migliore licenza. È inoltre destinato a passare facilmente da JSW a YAJSW. Certamente per me, nuovo di zecca per i server Windows e cercare di far funzionare un'app Java come servizio, è stato molto facile da usare.

Alcuni altri che ho trovato, ma non ho finito per usare:

  • Java Service Launcher Non l'ho usato perché sembrava più complicato funzionare rispetto a YAJSW. Non penso che questo sia un involucro.
  • JSmooth Creare i servizi di Windows non è il suo obiettivo principale, ma può essere fatto . Non l'ho usato perché non c'è stata attività dal 2007.

+1 da parte mia in quanto questa è stata la soluzione più rapida per me "pronta all'uso" e non è stata richiesta alcuna modifica dell'app java, il che è decisamente un vantaggio.
Green Day

Ho trovato questa tabella di confronto molto avvincente che ha confrontato YAJSW con alcuni altri wrapper di servizi comuni. yajsw.sourceforge.net/#mozTocId284533
Green

6

Penso che Java Service Wrapper funzioni bene. Nota che ci sono tre modi per integrare la tua applicazione. Sembra che l'opzione 1 funzionerà meglio per te dato che non vuoi cambiare il codice. Il file di configurazione può diventare un po 'folle, ma ricorda che (per l'opzione 1) il programma che stai iniziando e per il quale specifichi argomenti, è il loro programma di supporto, che avvierà quindi il tuo programma. Hanno un file di configurazione di esempio per questo.


5

Se usi Gradle Build Tool puoi provare il mio plug-in windows-service , che facilita l'uso di Apache Commons Daemon Procrun .

Per creare un'applicazione di servizio java windows con il plug-in è necessario eseguire diversi semplici passaggi.

  1. Creare una classe di servizio principale con il metodo appropriato.

    public class MyService {
    
        public static void main(String[] args) {
            String command = "start";
            if (args.length > 0) {
                command = args[0];
            }
            if ("start".equals(command)) {
                // process service start function
            } else {
                // process service stop function
            }
        }
    
    }
  2. Includi il plugin nel tuo build.gradlefile.

    buildscript {
      repositories {
        maven {
          url "https://plugins.gradle.org/m2/"
        }
      }
      dependencies {
        classpath "gradle.plugin.com.github.alexeylisyutenko:windows-service-plugin:1.1.0"
      }
    }
    
    apply plugin: "com.github.alexeylisyutenko.windows-service-plugin"

    Lo stesso frammento di script per il nuovo meccanismo di plug-in di incubazione introdotto in Gradle 2.1:

    plugins {
      id "com.github.alexeylisyutenko.windows-service-plugin" version "1.1.0"
    }
  3. Configura il plugin.

    windowsService {
      architecture = 'amd64'
      displayName = 'TestService'
      description = 'Service generated with using gradle plugin'   
      startClass = 'MyService'
      startMethod = 'main'
      startParams = 'start'
      stopClass = 'MyService'
      stopMethod = 'main'
      stopParams = 'stop'
      startup = 'auto'
    }
  4. Eseguire l'attività gradle createWindowsService per creare una distribuzione del servizio Windows.

Questo è tutto ciò che devi fare per creare un semplice servizio Windows. Il plug-in scaricherà automaticamente i binari di Daemon Procrun di Apache Commons, li estrarrà nella directory di distribuzione del servizio e creerà file batch per l'installazione / disinstallazione del servizio.

Nella ${project.buildDir}/windows-servicedirectory troverai eseguibili del servizio, script batch per l'installazione / disinstallazione del servizio e tutte le librerie di runtime. Per installare l'esecuzione del servizio <project-name>-install.bate se si desidera disinstallare l'esecuzione del servizio <project-name>-uninstall.bat. Per avviare e interrompere il servizio utilizzare <project-name>w.exeeseguibile.

Si noti che l'avvio del servizio di gestione dei metodi dovrebbe creare e avviare un thread separato per eseguire l'elaborazione, quindi tornare. Il metodo principale viene chiamato da thread diversi quando si avvia e si arresta il servizio.

Per maggiori informazioni, leggi il plugin e Apache Commons Daemon Procrun.


Risposta sottovalutata!
TaylanUB,


4

Con Java 8 possiamo gestire questo scenario senza strumenti esterni. Lo strumento javapackager fornito con java 8 offre un'opzione per creare pacchetti di applicazioni autonomi:

-native type Genera bundle di applicazioni indipendenti (se possibile). Utilizzare l'opzione -B per fornire argomenti ai bundler in uso. Se si specifica il tipo, viene creato solo un pacchetto di questo tipo. Se non viene specificato alcun tipo, viene utilizzato tutto.

I seguenti valori sono validi per il tipo:

-native type
Generate self-contained application bundles (if possible). Use the -B option to provide arguments to the bundlers being used. If type is specified, then only a bundle of this type is created. If no type is specified, all is used.

The following values are valid for type:

all: Runs all of the installers for the platform on which it is running, and creates a disk image for the application. This value is used if type is not specified.
installer: Runs all of the installers for the platform on which it is running.
image: Creates a disk image for the application. On OS X, the image is the .app file. On Linux, the image is the directory that gets installed.
dmg: Generates a DMG file for OS X.
pkg: Generates a .pkg package for OS X.
mac.appStore: Generates a package for the Mac App Store.
rpm: Generates an RPM package for Linux.
deb: Generates a Debian package for Linux.

Nel caso di Windows fare riferimento al seguente documento possiamo creare msi o exe, se necessario.

exe: Generates a Windows .exe package.
msi: Generates a Windows Installer package.

4
Questa risposta non risponde alla domanda. Il javapackager non può essere utilizzato per creare direttamente un servizio Windows, ma piuttosto per creare un eseguibile autonomo che, ad esempio, includa jre e altre risorse.
tobias_


3

è semplice in quanto devi inserire una scorciatoia

Windows 7 C:\users\All Users\Start Menu\Programs\Startup (Admin) oUser home directory(%userProfile%)

Windows 10: in esecuzione shell:startup

nella sua proprietà -> scorciatoia -> target -> java.exe -jar D:\..\runJar.jar

NOTA: questo verrà eseguito solo dopo il login


Con diritto di amministratore

sc create serviceName binpath= "java.exe -jar D:\..\runJar.jar" Creerà il servizio di Windows

se si ottiene timeout uso cmd /c D:\JAVA7~1\jdk1.7.0_51\bin\java.exe -jar d:\jenkins\jenkins.war, ma anche con questo si otterrà sarà avviato il timeout, ma in background java.exe. Check in task manager

NOTA: questo verrà eseguito all'avvio di Windows (prima dell'accesso, in base al servizio ' Startup Type')

Spiegazione dettagliata della creazione del servizio Windows


3

Usa " winsw " che è stato scritto per Glassfish v3 ma funziona bene con i programmi Java in generale.

Richiede .NET runtime installato.


Nel frattempo l'attuale versione (mantenuta dal noto Kohsuke Kawaguchi) si trova qui .
FrVaBe,

Sembra che lo abbia spostato su github dopo la versione 1.9 (molto probabilmente quando è passato da Oracle a Cloudbees).
Thorbjørn Ravn Andersen,

2

Ho usato JavaService prima con un buon successo. Non è stato aggiornato da un paio d'anni, ma era piuttosto solido quando l'ho usato.


GForge è stato sospeso
lww

2

Non mi sono piaciute le licenze per Java Service Wrapper. Sono andato con ActiveState Perl a scrivere un servizio che fa il lavoro.

Ho pensato di scrivere un servizio in C #, ma i miei limiti di tempo erano troppo stretti.


Puoi fornire l'hack di esempio che hai fatto con "perl" ..!
PeaceUser

2

Uso sempre sc.exe (vedi http://support.microsoft.com/kb/251192 ). Dovrebbe essere installato su XP da SP1 e se non è nel tuo sapore di Vista, puoi scaricarlo caricandolo con il kit di risorse Vista.

Non ho fatto nulla di troppo complicato con Java, ma usare un argomento della riga di comando completo (x: \ java.exe ....) o creare uno script con Ant per includere le dipendenze e impostare i parametri funziona bene per me.


1
Ciò ti consente di avviare qualcosa come un servizio, ma a mio avviso sarebbe poi staccato, cioè non potevi fermarlo tramite Servizi o riavviare automaticamente, ecc. Potrei sbagliarmi completamente però - ho appena iniziato a esaminare questo.
atomici

1

Un'altra buona opzione è FireDaemon . È utilizzato da alcuni grandi negozi come NASA, IBM, ecc .; consultare il loro sito Web per un elenco completo.


1

Attualmente sto richiedendo questo per eseguire un'applicazione basata su Eclipse ma devo prima impostare alcune variabili che sono locali per quell'applicazione. sc.exe consentirà solo gli eseguibili ma non gli script, quindi sono passato a autoexnt.exe che fa parte del kit di risorse di Windows 2003 . Limita il servizio a un singolo file batch ma ho solo bisogno di uno script batch per essere convertito in un servizio.

Ciao!


-1

Exe4j è un'ottima opzione anche se non è gratuita. Dai un'occhiata a Exe4j Nella procedura guidata per creare il file .exe, hai la possibilità di creare un servizio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.