Jak utworzyć usługę systemu Windows z aplikacji Java

220

Właśnie odziedziczyłem aplikację Java, którą należy zainstalować jako usługę na XP i Vista. Minęło około 8 lat, odkąd korzystałem z systemu Windows w dowolnej formie i nigdy nie musiałem tworzyć usługi, nie mówiąc już o aplikacji Java (mam słoik na aplikację i jeden słoik zależności - log4j ). Jaka magia jest niezbędna, aby uruchomić tę usługę? Mam źródło, więc możliwe są modyfikacje kodu, choć najlepiej ich unikać.

pomysłów
źródło
Inna sugestia stackoverflow.com/a/9262081/381897
bhdrkn
1
Dla kompletności: tutaj serverfault.com/a/259195 mówi, że aplikacja musi odpowiadać na wywołania zwrotne Menedżera sterowania usługami. Przeczytaj ten poradnik to wykorzystuje Procrun ticklingmind.blogspot.com/2010/03/...
Broken_Window
Inne odpowiedzi stackoverflow.com/questions/5953525/…
Ravi Parekh

Odpowiedzi:

69

Miałem trochę szczęścia z pakietem Java Service Wrapper

sblundy
źródło
11
Opakowanie usługi Java wygląda bardzo przydatne. Ale rzuciłem okiem na listę funkcji. Musisz tylko pamiętać, że wersja społeczności nie jest licencjonowana do używania na serwerze.
Brian Matthews,
To może być problem. Użyłem go kilka lat temu. Chyba zdecydowali się naładować.
sblundy
Z tego opakowania korzysta wiele projektów typu open source, w tym kilka na Dżakarcie Apache, takich jak ActiveMQ.
Todd
7
wrapper.tanukisoftware.org/doc/english/licenseCommunity.html Korzystanie z zamkniętego źródła GPL nie ogranicza możliwości tworzenia prywatnego oprogramowania do użytku wewnętrznego, które zależy od oprogramowania objętego GPL, o ile oprogramowanie to nigdy nie jest rozpowszechniane bez pełnego źródła cała aplikacja dostępna dla wszystkich użytkowników. Chociaż zachęcamy użytkowników korporacyjnych i rządowych do korzystania z umowy licencyjnej serwera lub licencji deweloperskiej, wspólnotowa umowa licencyjna jest akceptowana, o ile aplikacja jest przeznaczona do użytku wewnętrznego lub będzie zawsze dystrybuowana wraz z pełną wersją src.
Vladimir
1
@Vladimir tanuki wrapper nie jest już dostępny dla 64
bitowego
100

Apache Commons Daemon to dobra alternatywa. Posiada Procrun dla usług Windows i Jsvc dla demonów unix. Używa mniej restrykcyjnej licencji Apache, a Apache Tomcat wykorzystuje ją jako część siebie do działania w systemach Windows i Linux! Aby to działało, jest trochę trudne, ale jest wyczerpujący artykuł z działającym przykładem.

Poza tym możesz spojrzeć na bin \ service.bat w Apache Tomcat, aby dowiedzieć się, jak skonfigurować usługę. W Tomcat zmieniają nazwy plików binarnych Procrun (prunsrv.exe -> tomcat6.exe, prunmgr.exe -> tomcat6w.exe).

Coś, z czym walczyłem przy użyciu Procrun, twoje metody start i stop muszą zaakceptować parametry (String [] argv). Na przykład „start (String [] argv)” i „stop (String [] argv)” będą działać, ale „start ()” i „stop ()” spowodują błędy. Jeśli nie możesz zmodyfikować tych połączeń, zastanów się nad stworzeniem klasy bootstrapper, która może masować te połączenia w zależności od potrzeb.

Mcdon
źródło
Korzystając z refleksji, prawdopodobnie możesz obejść problem wskazany w ostatnim akapicie. Ponadto demon apache commons to jedyne znane mi opakowanie, które ma wbudowane 64-bitowe pliki binarne do bezpłatnego użytku.
djangofan,
Potrzebujesz powrotu karetki między każdą opcją JVM. Na przykład, jeśli masz na tej samej linii -Dopt1 = a -Dopt2 = b, to może nie działać. Aby to naprawić, musisz napisać --JvmOptions=-Dopt=a#-Dopt2=b. Z tego powodu uruchamiałem polecenie ze skryptu mrówki i przez kilka dni walczyłem. Mam nadzieję, że to pomoże.
Sydney
Artykuł, o którym mówiłeś, już nie istnieje ... Czy nadal masz sposób, aby się do niego dostać? Mam problem z nakłonieniem demona Apache Commons do zrobienia tego, czego potrzebuję.
11101101b
3
@ 11101101b, wydaje się, że apache dołączał wnętrzności tego artykułu do własnej strony wiki ...
Lucas
@community wiki, użyłem Apache Commons Daemon dla 64-bitowej maszyny z systemem Windows, dodałem usługę z powodzeniem. gdy używam tych samych procesów dla 32-bitowej maszyny z systemem Windows 7, nie można dodać usługi.
Shakthi
59

Dzięki Apache Commons Daemon możesz teraz mieć niestandardową nazwę i ikonę pliku wykonywalnego! Możesz również uzyskać niestandardowy monitor tacy Windows z własną nazwą i ikoną!

Mam teraz usługę uruchomioną z moją własną nazwą i ikoną (prunsrv.exe), a monitor zasobnika systemowego (prunmgr.exe) ma również własną nazwę i ikonę!

  1. Pobierz pliki binarne demona Apache Commons (będziesz potrzebował prunsrv.exe i prunmgr.exe).
  2. Zmień ich nazwy na odpowiednio MyServiceName.exei MyServiceNamew.exe.
  3. Pobierz WinRun4J i użyj RCEDIT.exedołączonego programu, aby zmodyfikować plik wykonywalny Apache, aby osadzić własną ikonę:

    > RCEDIT.exe /I MyServiceName.exe customIcon.ico
    > RCEDIT.exe /I MyServiceNamew.exe customTrayIcon.ico
  4. Teraz zainstaluj swoją usługę Windows w ten sposób ( więcej informacji i opcji znajdziesz w dokumentacji ):

    > 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. Teraz masz usługę Windows swojego słoika, która będzie działać z Twoją własną ikoną i nazwą! Możesz także uruchomić plik monitora, który uruchomi się na pasku zadań z własną ikoną i nazwą.

11101101b
źródło
1
Zrobiłem wszystko zgodnie z twoją instrukcją, ale to nie zmienia ikony paska zadań .. jakiś pomysł, dlaczego?
outofBounds
Przepraszam @outofBounds, do tej pory nie widziałem twojego komentarza. Program RCEDIT.exe modyfikuje ikonę pliku wykonywalnego usługi. Upewnij się, że masz prawidłowy plik .ico z poprawnie zdefiniowanym każdym rozmiarem. Możesz zobaczyć, jak utworzyć odpowiedni plik .ico tutaj: stackoverflow.com/questions/4354617/…
11101101b
2
Wiesz tylko, że nie możesz mieć spacji w nazwie usługi.
11101101b
1
Tak @Shakthi działa dobrze w 32 i 64-bitowym systemie Windows XP, 7, 8, 8.1, Server 2003, 2008 i 2012.
11101101b
1
Tak, @Syamsoul Azrein, działa świetnie na 10 i każdej edycji serwera.
11101101b
31

Prostym sposobem jest opakowanie NSSM Wrapper ( zobacz mój wpis na blogu ).

Giordano Maestro
źródło
7
SKAŁY NSSM! Łatwo sprawia, że ​​opakowanie nawet z mojego programu Java. Łatwy, lekki, działa - 100kb szczęścia! Dziękuję Ci!
cynepnaxa
1
Jakikolwiek przykład, jak użyć NSSM Wrapper do uruchomienia instancji aplikacji Java (używam HelioSearch) jako usługi Windows w tle podczas uruchamiania systemu?
Krunal
@ GiordanoMaestro twój wpis na blogu nie jest już dostępny. Czy masz inny link?
Matthieu,
2
W porównaniu z Apache Commons Daemon, wrapper.tanukisoftware.org i yajsw, NSSM był zdecydowanie najszybszą i najłatwiejszą opcją do przekształcenia prostej aplikacji Java w usługę Windows
Jeffrey Knight
Próbuję użyć NSSM, aby uruchomić słoik wykonywalny rozruchu wiosennego. Wystąpił błąd „Nieoczekiwany stan SERVICE_PAUSED w odpowiedzi na sterowanie START”.
Kiran Kumar
26

Jeszcze jedną opcją jest WinRun4J . Jest to konfigurowalny program uruchamiający Java, który pełni również rolę hosta usługi Windows (zarówno wersja 32-, jak i 64-bitowa). Jest to oprogramowanie typu open source i nie ma żadnych ograniczeń w jego użyciu.

(pełne ujawnienie: pracuję nad tym projektem).

Peter Smith
źródło
3
Dzięki za to. Wypróbowałem YAJWS i najpierw przestraszyłem się pobieraniem 19 MB, a po wykonaniu instrukcji pokazałem „błąd parsowania linii poleceń”. Spojrzałem na PROCRUN i jest to zbyt kłopotliwe dla szybkiej konfiguracji. INSTSRV / SRVANY wymaga zmian w rejestrze! Launch4J pakuje plik JAR w pliku EXE, więc komplikuje wdrażanie. WinRun4J był idealnie dopasowany. Jedyną wadą jest to, że wymaga specjalnej klasy do pracy jako usługa (zamiast po prostu wywoływać standardową klasę główną). Ale ogólnie jest w 99% idealny.
fernacolo
2
FYI, najnowsza wersja ma opakowanie dla standardowej klasy głównej.
Peter Smith,
Cześć. Czy możesz podać jakiś przykład wyjaśniający, jak z tego korzystać? Chciałbym go użyć do uruchomienia instancji HelioSearch jako usługi Windows w tle podczas uruchamiania systemu.
Krunal
17

Jeszcze inną odpowiedzią jest Yet Another Java Service Wrapper , wydaje się to być dobrą alternatywą dla Java Service Wrapper, ponieważ ma lepsze licencje. Jest również przeznaczony do łatwego przenoszenia z JSW do YAJSW. Z pewnością dla mnie, nowość na serwerach Windows i próba uruchomienia aplikacji Java jako usługi, była bardzo łatwa w użyciu.

Niektóre inne znalazłem, ale nie wykorzystałem:

atomów
źródło
+1 ode mnie, ponieważ było to dla mnie najszybsze rozwiązanie „od razu po wyjęciu z pudełka” i nie była wymagana modyfikacja aplikacji Java, co jest zdecydowanym plusem.
Green Day
Znalazłem bardzo przekonującą tabelę porównawczą, która porównała YAJSW z kilkoma innymi popularnymi opakowaniami usług. yajsw.sourceforge.net/#mozTocId284533
Green
6

Myślę, że opakowanie usługi Java działa dobrze. Pamiętaj, że istnieją trzy sposoby integracji aplikacji. Wygląda na to, że opcja 1 będzie dla ciebie najlepsza, biorąc pod uwagę, że nie chcesz zmieniać kodu. Plik konfiguracyjny może trochę zwariować, ale pamiętaj tylko, że (dla opcji 1) program, który uruchamiasz i dla którego będziesz określał argumenty, to jego program pomocniczy, który następnie uruchomi Twój program. Mają do tego przykładowy plik konfiguracyjny .

Ed Thomas
źródło
5

Jeśli używasz narzędzia Gradle Build Tool, możesz wypróbować moją wtyczkę do usługi Windows , która ułatwia korzystanie z Apache Commons Daemon Procrun .

Aby utworzyć aplikację usługi Windows Java za pomocą wtyczki, musisz wykonać kilka prostych kroków.

  1. Utwórz główną klasę usług za pomocą odpowiedniej metody.

    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. Dołącz wtyczkę do swojego build.gradlepliku.

    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"

    Ten sam fragment skryptu dla nowego, inkubującego mechanizmu wtyczek wprowadzonego w wersji 2.1:

    plugins {
      id "com.github.alexeylisyutenko.windows-service-plugin" version "1.1.0"
    }
  3. Skonfiguruj wtyczkę.

    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. Uruchom zadanie gradate createWindowsService, aby utworzyć dystrybucję usługi Windows.

To wszystko, co musisz zrobić, aby stworzyć prostą usługę Windows. Wtyczka automatycznie pobierze pliki binarne Apache Commons Daemon Procrun, rozpakuje te pliki binarne do katalogu dystrybucji usługi i utworzy pliki wsadowe do instalacji / deinstalacji usługi.

W ${project.buildDir}/windows-servicekatalogu znajdziesz pliki wykonywalne usługi, skrypty wsadowe do instalacji / deinstalacji usługi oraz wszystkie biblioteki wykonawcze. Aby zainstalować bieg usługi <project-name>-install.bati jeśli chcesz odinstalować bieg usługi <project-name>-uninstall.bat. Aby uruchomić i zatrzymać usługę, użyj <project-name>w.exepliku wykonywalnego.

Należy pamiętać, że uruchomienie usługi obsługi metody powinno utworzyć i uruchomić osobny wątek w celu przeprowadzenia przetwarzania, a następnie zwrócić. Główna metoda jest wywoływana z różnych wątków podczas uruchamiania i zatrzymywania usługi.

Aby uzyskać więcej informacji, przeczytaj o wtyczce i programie Apache Commons Daemon Procrun.

Alexey Lisyutenko
źródło
Niedoceniana odpowiedź!
TaylanUB,
4

Dzięki Javie 8 możemy poradzić sobie z tym scenariuszem bez żadnych zewnętrznych narzędzi. Narzędzie javapackager dostarczane z java 8 zapewnia opcję tworzenia samodzielnych pakietów aplikacji:

-natywny typ Generuj samodzielne pakiety aplikacji (jeśli to możliwe). Użyj opcji -B, aby podać argumenty używanym programom pakującym. Jeśli określono typ, tworzony jest tylko pakiet tego typu. Jeśli nie określono żadnego typu, używane jest wszystko.

Dla typu obowiązują następujące wartości:

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

W przypadku Windows zapoznaj się z następującym dokumentem , w razie potrzeby możemy utworzyć MSI lub exe.

exe: Generates a Windows .exe package.
msi: Generates a Windows Installer package.
Steephen
źródło
4
Ta odpowiedź nie dotyczy pytania. Javapackager nie może być używany do bezpośredniego tworzenia usługi Windows, ale raczej do tworzenia samodzielnego pliku wykonywalnego, który np. Zawiera Jre i inne zasoby.
tobias_
3

to proste, ponieważ musisz wprowadzić skrót

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

Windows 10: w trakcie uruchamiania shell:startup

w jego właściwości -> skrót -> cel -> java.exe -jar D:\..\runJar.jar

UWAGA: Uruchomi się to dopiero po zalogowaniu


Z uprawnieniami administratora

sc create serviceName binpath= "java.exe -jar D:\..\runJar.jar" Stworzy usługę Windows

jeśli masz limit czasu korzystania cmd /c D:\JAVA7~1\jdk1.7.0_51\bin\java.exe -jar d:\jenkins\jenkins.war, ale nawet z tym dostaniesz limit czasu, ale w tle java.exe zostanie uruchomiony. Sprawdź w menedżerze zadań

UWAGA: Uruchomi się przy uruchomieniu systemu Windows podczas logowania (przed zalogowaniem, na podstawie usługi ' Startup Type')

Szczegółowe objaśnienie tworzenia usługi Windows

Ravi Parekh
źródło
3

Użyj „ winsw ”, który został napisany dla Glassfish v3, ale ogólnie działa dobrze z programami Java.

Wymagaj zainstalowanego środowiska wykonawczego .NET.

Thorbjørn Ravn Andersen
źródło
Tymczasem znajduje się tutaj aktualna wersja (prowadzona przez znanego Kohsuke Kawaguchi) .
FrVaBe,
Wygląda na to, że przeniósł go na github po wersji 1.9 (najprawdopodobniej po przejściu z Oracle do Cloudbees).
Thorbjørn Ravn Andersen
2

Z powodzeniem korzystałem z JavaService . Nie był aktualizowany od kilku lat, ale był całkiem solidny, kiedy go używałem.


źródło
GForge zostało przerwane
LWW
2

Nie podobało mi się licencjonowanie oprogramowania Java Service Wrapper. Poszedłem z ActiveState Perl, aby napisać usługę, która działa.

Myślałem o napisaniu usługi w języku C #, ale moje ograniczenia czasowe były zbyt napięte.

Hugh Buchanan
źródło
Czy możesz podać przykładowy hack, który zrobiłeś z „perlem” ..!
peaceUser
2

Zawsze używam tylko sc.exe (patrz http://support.microsoft.com/kb/251192 ). Powinien być zainstalowany na XP z SP1, a jeśli nie jest w twoim stylu Vista, możesz pobrać go załadować z zestawem zasobów Vista.

Nie zrobiłem nic zbyt skomplikowanego z Javą, ale użycie w pełni kwalifikowanego argumentu wiersza poleceń (x: \ java.exe ....) lub utworzenie skryptu z Antem w celu uwzględnienia zależności i ustawienia parametrów działa dla mnie dobrze.

Kevin
źródło
1
To pozwala ci uruchomić coś jako usługę, ale w moim rozumieniu byłoby to wtedy odłączone, tj. Nie można było zatrzymać go za pośrednictwem Usług lub zrestartować automatycznie, itp. Mogę się jednak całkowicie mylić - po prostu zacząłem się tym zajmować.
atomicules
1

Inną dobrą opcją jest FireDaemon . Jest używany przez niektóre duże sklepy, takie jak NASA, IBM itp .; zobacz ich stronę internetową, aby uzyskać pełną listę.

Andrew Swan
źródło
1

Obecnie wymagam tego do uruchomienia aplikacji opartej na środowisku Eclipse, ale najpierw muszę ustawić niektóre zmienne lokalne dla tej aplikacji. sc.exe zezwala tylko na pliki wykonywalne, ale nie na skrypty, więc zwróciłem się do autoexnt.exe, który jest częścią zestawu zasobów Windows 2003 . Ogranicza usługę do jednego pliku wsadowego, ale potrzebuję tylko jednego skryptu wsadowego, aby przekonwertować go na usługę.

cześć!


źródło
-1

Exe4j to bardzo dobra opcja, choć nie jest darmowa. Sprawdź to na Exe4j W kreatorze, aby utworzyć plik .exe, masz opcję utworzenia usługi.

Baran
źródło