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.

Author: ideasculptor, 2008-09-16

19 answers

Ho avuto un po ' di fortuna con il Wrapper del servizio Java

 62
Author: sblundy, 2008-09-16 00:11:11

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.

 90
Author: mcdon, 2012-09-12 01:52:31

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!

  1. Scarica i binari del demone Apache Commons (avrai bisogno di prunsrv.exe e prunmgr.exe).
  2. Rinominarli in be MyServiceName.exe e MyServiceNamew.exe rispettivamente.
  3. 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
    
  4. 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
    
  5. 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.

 51
Author: 11101101b, 2015-12-14 14:08:07

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).

 23
Author: Peter Smith, 2009-05-11 07:50:53

Un modo semplice è il Wrapper NSSMWrapper ( vedere il mio blog).

 19
Author: Giordano Maestro, 2014-10-06 09:54:40

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.
 16
Author: atomicules, 2010-09-02 11:02:18

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.

 6
Author: Ed Thomas, 2008-09-16 15:13:06

JavaService è LGPL. È molto facile e stabile. Raccomando.

 4
Author: NT_, 2009-10-12 08:51:49

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

Richiede.NET runtime installato.

 3
Author: Thorbjørn Ravn Andersen, 2017-11-17 21:30:32

Ho usato JavaService prima con buon successo. Non è stato aggiornato in un paio di anni, ma era abbastanza solido quando l'ho usato.

 2
Author: , 2008-09-16 02:20:33

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.

 2
Author: Hugh Buchanan, 2008-09-16 02:27:05

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.

 2
Author: Kevin, 2008-09-16 02:34:18

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

Personalmente come launch4j

 2
Author: pushNpop, 2010-12-30 02:38:35

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.
 2
Author: Steephen, 2017-08-24 01:57:45

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.

 1
Author: Andrew Swan, 2008-09-16 06:40:59

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!

 1
Author: , 2008-09-23 00:26:54

È 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

 1
Author: Ravi Parekh, 2017-05-23 10:31:31

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.

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

 1
Author: Alexey Lisyutenko, 2017-11-28 16:43:51

Exe4j è un'ottima opzione anche se non è gratuita. Check it out a Exe4j Nella procedura guidata per creare il .file exe, si è dare la possibilità di creare un servizio.

 -1
Author: Ram, 2013-12-17 07:06:26