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 barattolo per l’app e un singolo barattolo delle dipendenze – log4j ). Qual è la magia necessaria per rendere questo correre come un servizio? Ho la fonte, quindi le modifiche al codice, anche se preferibilmente evitate, sono possibili.

Ho avuto un po ‘di fortuna con Java Service Wrapper

Apache Commons Daemon è una buona alternativa. Ha Procrun per i servizi Windows e Jsvc per i demoni unix. Utilizza 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 un esempio funzionante.

Oltre a ciò, è ansible esaminare bin \ service.bat in Apache Tomcat per avere un’idea di come impostare il servizio. In Tomcat vengono rinominati i binari Procrun (prunsrv.exe -> tomcat6.exe, prunmgr.exe -> tomcat6w.exe).

Qualcosa su cui ho dovuto fare a meno di usare Procrun, i 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 è ansible modificare tali chiamate, prendere in considerazione l’idea di creare una class bootstrapper in grado di massaggiare tali chiamate in base alle proprie esigenze.

Con Apache Commons Daemon ora puoi avere un nome e un’icona eseguibili personalizzati! È inoltre ansible ottenere un monitor vassoio personalizzato di Windows con il proprio nome e l’icona!

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

  1. Scarica i binari Apache Commons Daemon (avrai bisogno di prunsrv.exe e prunmgr.exe).
  2. Rinominarli rispettivamente MyServiceName.exe e MyServiceNamew.exe .
  3. Scarica WinRun4J e usa il programma RCEDIT.exe che viene 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 (consulta 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! È inoltre ansible avviare il file del monitor e verrà eseguito nella barra delle applicazioni con la propria icona e il proprio nome.

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

(completa divulgazione: lavoro su questo progetto).

Un modo semplice è Wrapper Wrapper NSSM ( vedere il mio post di blog ).

Ancora un’altra risposta è ancora un altro wrapper del servizio Java , questa sembra una buona alternativa a Java Service Wrapper come ha una migliore licenza. È anche pensato per 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 ho trovato, ma non ho finito per usare:

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

Penso che Java Service Wrapper funzioni bene. Nota che ci sono tre modi per integrare la tua 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 solo che (per l’opzione 1) il programma che stai iniziando e per il quale specifichi argomenti, è il loro programma di supporto, che inizierà il tuo programma. Hanno un esempio di file di configurazione per questo.

JavaService è LGPL. È molto facile e stabile Altamente raccomandato.

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

Richiede il runtime .NET installato.

Ho usato JavaService prima con un buon successo. Non è stato aggiornato in un paio d’anni, ma era molto solido quando l’ho usato.

Non mi piaceva la licenza 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.

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

Non ho fatto nulla di troppo complicato con Java, ma l’utilizzo di un argomento della riga di comando completamente qualificato (x: \ java.exe ….) o la creazione di uno script con Ant per includere le dipendenze e impostare i parametri funziona correttamente.

Un buon confronto tra diverse soluzioni è disponibile su: http://yajsw.sourceforge.net/#mozTocId284533

Personalmente come launch4j

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:

-nativo tipo Genera pacchetti di applicazioni autonome (se ansible). Utilizzare l’opzione -B per fornire argomenti ai bundler in uso. Se viene specificato 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 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, consulta il seguente documento , possiamo creare msi o exe secondo necessità.

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

Un’altra buona opzione è FireDaemon . È usato da alcuni grandi negozi come la NASA, l’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 che sono locali per quella applicazione. sc.exe consentirà solo gli eseguibili ma non gli script, quindi mi sono rivolto a autoexnt.exe che fa parte del kit di risorse di Windows 2003 . Limita il servizio a un singolo file batch ma ho bisogno solo di uno script batch da convertire in un servizio.

Ciao!

è semplice come devi mettere scorciatoia

Windows 7 C:\users\All Users\Start Menu\Programs\Startup (amministratore) o User home directory(%userProfile%)

Windows 10: In Run shell:startup

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

NOTA: questo verrà eseguito solo dopo aver effettuato l’accesso


Con Admin Right

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

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

NOTA: verrà eseguito all’avvio del logon di Windows (prima dell’ingresso, in base al servizio ” Startup Type “)

Spiegazione dettagliata della creazione del servizio di Windows

Se usi Gradle Build Tool puoi provare il mio plugin per windows-service , che facilita l’uso di Apache Commons Daemon Procrun .

Per creare un’applicazione di servizio Windows Java con il plug-in è necessario eseguire diversi passaggi semplici.

  1. Creare una class 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. Includere il plug-in build.gradle 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 snippet di script per il nuovo meccanismo di incubazione, plug-in 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 task gradle createWindowsService per creare una distribuzione del servizio Windows.

Questo è tutto ciò che devi fare per creare un semplice servizio Windows. Il plugin scaricherà automaticamente i file binari di Apache Commons Daemon Procrun, estrae questi binari nella directory di distribuzione del servizio e crea i file batch per l’installazione / disinstallazione del servizio.

Nella directory ${project.buildDir}/windows-service troverai gli eseguibili del servizio, gli script batch per l’installazione / disinstallazione del servizio e tutte le librerie di runtime. Per installare il servizio eseguire -install.bat e se si desidera disinstallare il servizio eseguire -uninstall.bat . Per avviare e interrompere il servizio, utilizzare l’eseguibile w.exe .

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 viene chiamato da diversi thread quando si avvia e si arresta il servizio.

Per ulteriori informazioni, si prega di leggere sul plugin e Apache Commons Daemon Procrun.

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