Come creare un servizio Windows dall'app java
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, per non parlare di qualcosa come un'app java (ho un jar per l'app e un singolo jar di dipendenza - log4j). Qual è la magia necessaria per rendere questo run as a service? Ho la fonte, quindi le modifiche al codice, anche se preferibilmente evitate, sono possibili.
19 answers
Ho avuto un po ' di fortuna con il Wrapper del servizio Java
Apache Commons Daemon è una buona alternativa. Ha Procrun per i servizi Windows e Jsvc per i demoni unix. Usa una licenza Apache meno restrittiva e Apache Tomcat lo usa come parte di se stesso per funzionare su Windows e Linux! Per farlo funzionare è un po ' complicato, ma c'è un articolo esaustivo con esempio di lavoro.
Oltre a ciò, puoi guardare il servizio bin\.bat in Apache Tomcat per avere un'idea di come configurare il servizio. In Tomcat rinominano i binari di Procrun (prunsrv.exe - > tomcat6.exe, prunmgr.exe -> tomcat6w.exe).
Qualcosa con cui ho faticato a usare 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 è possibile modificare tali chiamate, considerare la possibilità di creare una classe bootstrapper che possa massaggiare tali chiamate in base alle proprie esigenze.
Con Apache Commons Daemon ora puoi avere un nome e un'icona eseguibile personalizzati! È inoltre possibile ottenere un monitor vassoio di Windows personalizzato con il proprio nome e l'icona!
Ora ho il mio servizio in esecuzione con il mio nome e icona (prunsrv.exe), e il monitor della barra delle applicazioni (prunmgr.exe) ha anche il mio nome personalizzato e l'icona!
- Scarica i binari del demone Apache Commons (avrai bisogno di prunsrv.exe e prunmgr.exe).
- Rinominarli in be
MyServiceName.exe
eMyServiceNamew.exe
rispettivamente. -
Scarica WinRun4J e usa il programma
RCEDIT.exe
che viene fornito con esso per modificare l'eseguibile Apache per incorporare la tua icona personalizzata in questo modo:> RCEDIT.exe /I MyServiceName.exe customIcon.ico > RCEDIT.exe /I MyServiceNamew.exe customTrayIcon.ico
-
Ora installa il tuo servizio Windows in questo modo (vedi 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
Ora hai un servizio Windows del tuo barattolo che verrà eseguito con la tua icona e il tuo nome! È inoltre possibile avviare il file monitor e verrà eseguito nella barra delle applicazioni con la propria icona e il nome.
Un'altra opzione è WinRun4J. Si tratta di un lanciatore java configurabile che funge anche da host di servizio di Windows (entrambe le versioni a 32 e 64 bit). È open source e non ci sono restrizioni sul suo utilizzo.
(full disclosure: lavoro su questo progetto).
Un modo semplice è il Wrapper NSSMWrapper ( vedere il mio blog).
Un'altra risposta è Ancora un altro Java Service Wrapper, questa sembra una buona alternativa al Java Service Wrapper in quanto ha una migliore licenza. È anche destinato a essere facile da spostare da JSW a YAJSW. Certamente per me, nuovo di zecca per i server Windows e cercando di ottenere un'app Java in esecuzione 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 per ottenere lavoro di YAJSW. Non credo sia un involucro.
- JSmooth Creare i servizi di Window non è il suo obiettivo primario, ma può essere fatto . Non l'ho usato perché non c'è stata attività dal 2007.
Penso che Java Service Wrapper funzioni bene. Si noti che ci sono tre modi per integrare l'applicazione. Sembra che l'opzione 1 funzioni meglio per te dato che non vuoi cambiare il codice. Il file di configurazione può diventare un po ' pazzo, ma ricorda che (per l'opzione 1) il programma che stai avviando e per il quale specificherai argomenti, è il loro programma di supporto, che avvierà il tuo programma. Hanno un file di configurazione di esempio per questo.
JavaService è LGPL. È molto facile e stabile. Raccomando.
Usa " winsw " che è stato scritto per Glassfish v3 ma funziona bene con i programmi Java in generale.
Richiede.NET runtime installato.
Ho usato JavaService prima con buon successo. Non è stato aggiornato in un paio di anni, ma era abbastanza solido quando l'ho usato.
Non mi è piaciuta la licenza per il Wrapper del servizio Java. Sono andato con ActiveState Perl per scrivere un servizio che fa il lavoro.
Ho pensato di scrivere un servizio in c#, ma i miei limiti di tempo erano troppo stretti.
Io uso sempre e solo sc.exe (cfr. http://support.microsoft.com/kb/251192 ). Dovrebbe essere installato su XP da SP1, e se non è nel vostro sapore di Vista, è possibile scaricare caricarlo con il kit di risorse Vista.
Non ho fatto nulla di troppo complicato con Java, ma usando un argomento della riga di comando completo (x:\java.exe ....) o la creazione di uno script con Ant per includere le dipendenze e impostare i parametri funziona bene per me.
Un buon confronto di diverse soluzioni è disponibile su : http://yajsw.sourceforge.net/#mozTocId284533
Personalmente come launch4j
Con Java 8 possiamo gestire questo scenario senza strumenti esterni. javapackager lo strumento fornito con java 8 fornisce un'opzione per creare pacchetti di applicazioni autonomi:
-tipo nativo Generare pacchetti di applicazioni indipendenti (se possibile). Utilizzare l'opzione-B per fornire argomenti ai bundler utilizzati. Se viene specificato type, viene creato solo un bundle di questo tipo. Se non viene specificato alcun tipo, viene utilizzato tutto.
I seguenti valori sono validi per 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.
In caso di Windows fare riferimento al seguente doc possiamo creare msi o exe secondo necessità.
exe: Generates a Windows .exe package.
msi: Generates a Windows Installer package.
Un'altra buona opzione è FireDaemon. E ' utilizzato da alcuni grandi negozi come la NASA, IBM, ecc; vedere il loro sito web per un elenco completo.
Attualmente sto richiedendo questo per eseguire un'applicazione basata su Eclipse, ma ho bisogno di impostare prima alcune variabili locali per quell'applicazione. SC.exe consentirà solo eseguibili ma non script, quindi mi sono rivolto a autoexnt.exe che fa parte del di Windows 2003 resource kit . Limita il servizio a un singolo file batch, ma ho solo bisogno di uno script batch per essere convertito in un servizio.
Ciao!
È semplice in quanto devi mettere la scorciatoia in
Finestre 7
C:\users\All Users\Start Menu\Programs\Startup
(Amministratore) o User home directory(%userProfile%)
Finestre 10 :
In esecuzione shell:startup
Nella sua proprietà - > scorciatoia - > destinazione - > java.exe -jar D:\..\runJar.jar
NOTA: questo verrà eseguito solo dopo aver effettuato il login
Con Admin Right
sc create serviceName binpath= "java.exe -jar D:\..\runJar.jar"
Creerà il servizio di Windows
Se ottieni timeout usa cmd /c D:\JAVA7~1\jdk1.7.0_51\bin\java.exe -jar d:\jenkins\jenkins.war
ma anche con questo otterrai il timeout ma in background java.exe sarà iniziare. Verifica gestione attività
NOTA: questo verrà eseguito all'avvio dell'accesso a Windows (prima dell'accesso, in base al servizio 'Startup Type
')
Spiegazione dettagliata della creazione del servizio Windows
Se si utilizza Gradle Strumento di compilazione si può provare il mio windows-service-plugin, che facilita l'utilizzo di Apache Commons Daemon Procrun.
Per creare un'applicazione di servizio java Windows con il plugin è necessario passare attraverso diversi semplici passaggi.
-
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 } } }
-
Includere il plugin nel file
build.gradle
.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, meccanismo di plugin introdotto in Gradle 2.1:
plugins { id "com.github.alexeylisyutenko.windows-service-plugin" version "1.1.0" }
-
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' }
Eseguire createWindowsService attività gradle per creare una distribuzione del servizio Windows.
Questo è tutto quello che devi fare per creare un semplice servizio di Windows. Il plugin scaricherà automaticamente Apache Commons Daemon Procrun binari, estrarre questi binari nella directory di distribuzione del servizio e creare file batch per l'installazione/disinstallazione del servizio.
Nella directory ${project.buildDir}/windows-service
si trovano gli eseguibili del servizio, gli script batch per l'installazione/disinstallazione del servizio e tutte le librerie di runtime.
Per installare il servizio eseguire <project-name>-install.bat
e se si desidera disinstallare il servizio eseguire <project-name>-uninstall.bat
.
Per avviare e arrestare il servizio utilizzare <project-name>w.exe
eseguibile.
Si noti che l'avvio del servizio di gestione del metodo deve creare e avviare un thread separato per eseguire l'elaborazione e quindi restituire. Il metodo principale è chiamato da diversi discussioni quando si avvia e si interrompe il servizio.
Per ulteriori informazioni, leggere il plugin e il demone Apache Commons Procrun.