it-swarm-eu.dev

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 jar di dipendenza - 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.

207
ideasculptor

Ho avuto fortuna con Java Service Wrapper

66
sblundy

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 lo usa come parte di se stesso per funzionare su Windows e Linux! Per farlo funzionare è un po 'complicato, ma c'è un esaustivo articolo con un esempio funzionante.

Oltre a questo, puoi dare un'occhiata al 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 è possibile modificare tali chiamate, prendere in considerazione l'idea di creare una classe bootstrapper in grado di massaggiare tali chiamate in base alle proprie esigenze.

94
mcdon

Con Apache Commons Daemon ora puoi avere un nome e un'icona eseguibili personalizzati! Puoi anche ottenere un monitor personalizzato per Windows con il tuo 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 il Apache Commons Daemon binari (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 (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 Jar che verrà eseguito con la tua icona e il tuo nome! È inoltre possibile avviare il file del monitor e verrà eseguito nella barra delle applicazioni con la propria icona e il proprio nome.

53
11101101b

Un'altra opzione è WinRun4J . Si tratta di 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 sul suo utilizzo.

(completa divulgazione: lavoro su questo progetto).

25
Peter Smith

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

25
Giordano Maestro

Un'altra risposta è Yet Another Java Service Wrapper , 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 Window non è il suo obiettivo principale, ma può essere fatto . Non l'ho usato perché non c'è stata alcuna attività dal 2007.
17
atomicules

Penso che il 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 'folle, 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 avvia il tuo programma. Hanno un esempio di file di configurazione per questo.

6
Ed Thomas

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

4
NT_

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

Per creare un'applicazione di servizio Windows Java 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 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. Esegui createWindowsService attività gradle 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 file binari 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 sono presenti 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 interrompere 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 viene chiamato da diversi thread quando si avvia e si arresta il servizio.

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

4

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

Richiede il runtime .NET installato.

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

-nativo tipo Genera pacchetti di applicazioni autonome (se possibile). 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, fai riferimento ai seguenti doc possiamo creare msi o exe se necessario.

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

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.

2
Hugh Buchanan

Uso sempre sc.exe (si veda 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 completo (x:\Java.exe ....) o la creazione di uno script con Ant per includere le dipendenze e impostare i parametri funziona correttamente.

2
Kevin

è semplice come devi mettere scorciatoia in

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

Windows 10: In Esegui 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" Creerà il servizio 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 verrà avviato Java.exe. Controlla il task manager

NOTA: Questo verrà eseguito all'avvio di Windows Logon (prima dell'ingresso, Basato sul servizio 'Startup Type')

spiegazione dettagliata della creazione del servizio Windows

2
Ravi Parekh

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

Personalmente come launch4j

2
pushNpop

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

2
Jason

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 è parte del Windows 2003 resource kit . Limita il servizio a un singolo file batch ma ho bisogno solo di uno script batch da convertire in un servizio.

ciao!

1
ramfree17

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.

1
Andrew Swan