Java uygulamasından bir Windows hizmeti nasıl oluşturulur


220

Ben sadece XP ve Vista üzerinde bir hizmet olarak yüklenmesi gereken bir java uygulamasını miras aldım. Herhangi bir biçimde pencereleri kullandığımdan beri yaklaşık 8 yıl oldu ve asla bir hizmet oluşturmak zorunda kalmadım, bir java uygulaması gibi bir şeyden bağımsız olarak (uygulama için bir kavanoz ve tek bir bağımlılık kavanozum var - log4j ). Bunu bir hizmet olarak çalıştırmak için gereken sihir nedir? Kaynağı aldım, bu yüzden kod modifikasyonları, tercihen kaçınılması mümkün.



1
Tamlık için: burada serverfault.com/a/259195 , uygulamanın Service Control Manager geri çağrılarına yanıt vermesi gerektiğini söylüyor. Procrun kullanan bu öğreticiyi okuyun ticklingmind.blogspot.com/2010/03/…
Broken_Window

Yanıtlar:


69

Java Service Wrapper ile biraz şansım oldu


11
Java Service Wrapper çok kullanışlı görünüyor. Ancak özellik listesine bir göz attım. Topluluk sürümünün sunucuda kullanılmak üzere lisanslanmadığını bilmeniz gerekir.
Brian Matthews

Bu bir sorun olabilir. Birkaç yıl önce kullandım. Sanırım suçlamaya karar verdiler.
sblundy

Bu sarıcı, Jakarta Apache'de ActiveMQ gibi birkaç açık kaynak projesi tarafından kullanılıyor.
Todd

7
wrapper.tanukisoftware.org/doc/english/licenseCommunity.html Kapalı Kaynak Kullanımı GPL, yazılımın tam kaynağı yapılmadan asla dağıtılmadığı sürece, GPL kapsamındaki yazılıma bağlı olan özel yazılımların dahili kullanım için geliştirilmesini kısıtlamaz. tüm uygulama tüm kullanıcılar tarafından kullanılabilir. Kurumsal ve hükümet kullanıcılarını bir Sunucu veya Geliştirme Lisans Anlaşması'ndan yararlanmaya teşvik etsek de, Topluluk Lisans Anlaşması başvuru dahili kullanım olduğu sürece veya her zaman tam src ile birlikte dağıtılacağı sürece kabul edilebilir.
Vladimir

1
@Vladimir tanuki sarmalayıcı artık 64bit kemer için açık değil
gerrytan

100

Apache Commons Daemon iyi bir alternatif. Bu gelmiştir Procrun pencereler hizmetler için ve Jsvc Unix cinleri için. Daha az kısıtlayıcı Apache lisansı kullanır ve Apache Tomcat, Windows ve Linux'ta çalıştırmak için kendi parçası olarak kullanır! İşe almak biraz zor, ancak çalışma örneğiyle kapsamlı bir makale var.

Bunun yanı sıra, hizmeti nasıl kuracağınıza dair bir fikir edinmek için Apache Tomcat'teki bin \ service.bat dosyasına bakabilirsiniz . Tomcat'te Procrun ikili dosyalarını yeniden adlandırırlar (prunsrv.exe -> tomcat6.exe, prunmgr.exe -> tomcat6w.exe).

Procrun kullanarak uğraştığım bir şey, start ve stop yöntemleriniz parametreleri kabul etmelidir (String [] argv). Örneğin, "start (String [] argv)" ve "stop (String [] argv)" çalışır, ancak "start ()" ve "stop ()" hatalara neden olur. Bu çağrıları değiştiremiyorsanız, bu çağrıları ihtiyaçlarınıza uyacak şekilde masaj yapabilen bir bootstrapper sınıfı yapmayı düşünün.


Yansımayı kullanarak, muhtemelen son paragrafınızda belirttiğiniz sorunun üstesinden gelebilirsiniz. Ayrıca, apache commons daemon, ücretsiz kullanım için önceden oluşturulmuş 64 bit ikili dosyalara sahip olduğunu bildiğim tek sarıcıdır.
djangofan

Her JVM Seçenekleri arasında bir satır başı gerekir. Örneğin, aynı satırda -Dopt1 = a -Dopt2 = b varsa, çalışmayabilir. Düzeltmek için yazmanız gerekir --JvmOptions=-Dopt=a#-Dopt2=b. Komutu bir karınca senaryosundan çalıştırıyordum ve bu yüzden günlerce mücadele ediyordum. Umarım yardımcı olur.
Sydney

Bahsettiğiniz makale artık mevcut değil ... Buna ulaşmak için hala bir yolunuz var mı? Apache Commons Daemon'u ihtiyacım olanı yapmakta zorlanıyorum.
11101101b

3
@ 11101101b, apache makalenin cesaretlerini kendi wiki sayfasına iliştirmiş gibi görünüyor ...
Lucas

@community wiki, 64-bit windows makine için Apache Commons Daemon kullandım , hizmeti başarıyla ekledi. 32-bit Windows 7 makine için aynı işlemleri kullanırken hizmet eklemek başarısız.
Shakthi

59

Apache Commons Daemon ile artık özel bir çalıştırılabilir isme ve simgeye sahip olabilirsiniz! Ayrıca kendi adınız ve simgenizle özel bir Windows tepsi monitörü de alabilirsiniz!

Artık kendi adım ve simgem (prunsrv.exe) ile çalışan hizmetim var ve sistem tepsisi monitörü (prunmgr.exe) de kendi özel adım ve simgeme sahip!

  1. Apache Commons Daemon ikili dosyalarını indirin (prunsrv.exe ve prunmgr.exe'ye ihtiyacınız olacak).
  2. Bunları sırasıyla MyServiceName.exeve MyServiceNamew.exeolarak yeniden adlandırın .
  3. WinRun4J'yi indirin ve RCEDIT.exeonunla birlikte gelen programı kullanarak kendi özel simgenizi bu şekilde gömmek için Apache yürütülebilir dosyasını değiştirin:

    > RCEDIT.exe /I MyServiceName.exe customIcon.ico
    > RCEDIT.exe /I MyServiceNamew.exe customTrayIcon.ico
  4. Şimdi Windows hizmetinizi şu şekilde yükleyin ( daha fazla ayrıntı ve seçenek için belgelere bakın ):

    > 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. Artık Jar'inizde kendi simgeniz ve adınızla çalışacak bir Windows hizmetiniz var! Monitör dosyasını da başlatabilirsiniz; sistem tepsisinde kendi simgeniz ve adınızla çalışır.


1
Her şeyi Nasıl Yapılır kısmına göre yaptım, ancak systray simgesini değiştirmez .. neden herhangi bir fikir?
outofBounds

Üzgünüz @outofBounds, yorumunuzu şimdiye kadar görmedim. RCEDIT.exe programı, hizmet çalıştırılabilirinizin simgesini değiştiren programdır. Her boyutun doğru tanımlanmış geçerli bir .ico dosyanız olduğundan emin olun. Nasıl düzgün bir .ico dosyası oluşturabileceğinizi görebilirsiniz: stackoverflow.com/questions/4354617/…
11101101b

2
Bildiğiniz gibi, hizmet adında boşluk olamaz.
11101101b

1
Evet @Shakthi 32 ve 64 bit Windows XP, 7, 8, 8.1, Server 2003, 2008 ve 2012'de iyi
çalışıyor

1
Evet, @Syamsoul Azrein, 10 ve herhangi bir sunucu sürümünde harika çalışıyor.
11101101b

31

Basit bir yol NSSM Wrapper Wrapper ( blog girişime bakın ).


7
NSSM KAYAÇLARI! Java programımdan bile sarıcı yapıyorum. Kolay, hafif, çalışır - 100kb mutluluk! Teşekkür ederim!
cynepnaxa

1
Herhangi bir örnek, sistem başlangıcında arka planda bir windows hizmeti olarak java uygulaması (HelioSearch kullanıyorum) örneğini başlatmak için NSSM Wrapper nasıl kullanılır?
Krunal

@GiordanoMaestro blog girişinize artık erişilemiyor. Başka bağlantın var mı?
Matthieu

2
Apache Commons Daemon, wrapper.tanukisoftware.org ve yajsw ile karşılaştırıldığında, NSSM, basit bir java uygulamasını bir pencere hizmetine dönüştürmek için açık ara en hızlı ve en kolay seçenektir
Jeffrey Knight

Bahar önyükleme yürütülebilir kavanoz çalıştırmak için NSSM kullanmaya çalışıyorum. Bu hatayı aldım, "START denetimine yanıt olarak beklenmeyen durum SERVICE_PAUSED."
Kiran Kumar

26

Bir seçenek daha WinRun4J . Bu, Windows hizmet ana bilgisayarı (hem 32 hem de 64 bit sürümleri) olarak iki katına çıkarılabilir yapılandırılabilir bir java başlatıcısıdır. Açık kaynak kodludur ve kullanımı konusunda herhangi bir kısıtlama yoktur.

(tam açıklama: Bu proje üzerinde çalışıyorum).


3
Bunun için teşekkürler. Ben YAJWS denedim ve ilk 19mb indir ile beni korkuttu ve talimatları izledikten sonra "komut satırı ayrıştırma hatası" gösterdi. PROCRUN'a baktım ve hızlı bir kurulum için çok hantal. INSTSRV / SRVANY kayıt defteri değişiklikleri gerektirir! Launch4J bir EXE içindeki bir JAR'ı paketler, böylece dağıtımları zorlaştırır. WinRun4J mükemmel bir uyumdu. Tek dezavantajı, bir hizmet olarak çalışmak için özel bir sınıf gerektirmesidir (sadece standart ana sınıfı çağırmak yerine). Ama genel olarak% 99 mükemmel.
fernacolo

2
FYI, en son sürümde standart bir ana sınıf için bir sarıcı var.
Peter Smith

Merhaba, Bunun nasıl kullanılacağını açıklayan herhangi bir örnek verebilir misiniz? Sistem başlangıcında bir arka plan windows hizmeti olarak HelioSearch örneğini başlatmak için kullanmak istiyorum.
Krunal

17

Yine başka bir cevap Yine Başka Bir Java Servis Sarıcı , bu daha iyi lisanslama gibi Java Servis Sarıcı için iyi bir alternatif gibi görünüyor. Ayrıca JSW'den YAJSW'a taşınması da kolay bir şekilde tasarlanmıştır. Kesinlikle benim için, Windows sunucularına yepyeni ve hizmet olarak çalışan bir Java uygulaması almaya çalışırken, kullanımı çok kolaydı.

Bazıları buldum, ancak kullanmadım:

  • Java Service Launcher Bunu kullanmadım çünkü YAJSW'den daha karmaşık görünüyordu. Bunun bir sarıcı olduğunu sanmıyorum.
  • JSmooth Window'un hizmetlerini oluşturmak ana hedefi değildir, ancak yapılabilir . Bunu kullanmadım çünkü 2007'den beri hiç etkinlik yok.

Bu benden +1 benim için "kutudan" için en hızlı çözüm ve kesin bir artı olan java app hiçbir değişiklik gerekli oldu.
Green Day

YAJSW ile birkaç yaygın hizmet paketini karşılaştıran bu çok çekici karşılaştırma tablosunu buldum. yajsw.sourceforge.net/#mozTocId284533
Yeşil

6

Java Service Wrapper'ın iyi çalıştığını düşünüyorum . Olduğunu unutmayın üç yolu uygulamanızı entegre etmek. Kodu değiştirmek istemediğiniz göz önüne alındığında, seçenek 1 sizin için en iyi sonucu verecek gibi görünüyor. Yapılandırma dosyası biraz deli olabilir, ancak sadece (seçenek 1 için) başlattığınız ve argümanlarını belirteceğiniz programın, programınızı başlatacak yardımcı programı olduğunu unutmayın. Bunun için örnek bir yapılandırma dosyası var .


5

Gradle Build Tool kullanıyorsanız, Apache Commons Daemon Procrun'un kullanımını kolaylaştıran windows-service-plugin'imi deneyebilirsiniz .

Eklenti ile bir java windows servis uygulaması oluşturmak için birkaç basit adımdan geçmeniz gerekir.

  1. Uygun yöntemle bir ana hizmet sınıfı oluşturun.

    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. Eklentiyi build.gradledosyanıza ekleyin .

    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"

    Gradle 2.1'de tanıtılan yeni, kuluçka, eklenti mekanizması için aynı kod snippet'i:

    plugins {
      id "com.github.alexeylisyutenko.windows-service-plugin" version "1.1.0"
    }
  3. Eklentiyi yapılandırın.

    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. Windows hizmeti dağıtımı oluşturmak için createWindowsService sınıflandırma görevini çalıştırın .

Basit bir windows hizmeti oluşturmak için tek yapmanız gereken bu. Eklenti, Apache Commons Daemon Procrun ikili dosyalarını otomatik olarak indirir, bu ikili dosyaları hizmet dağıtım dizinine çıkarır ve hizmetin yüklenmesi / kaldırılması için toplu dosyalar oluşturur.

Gelen ${project.buildDir}/windows-servicedizinde hizmetin kurma / kaldırma ve tüm çalışma zamanı kitaplıkları için hizmet yürütülebilir, toplu komut bulacaksınız. Hizmet çalıştırmasını yüklemek için ve hizmet çalıştırmasını <project-name>-install.batkaldırmak istiyorsanız <project-name>-uninstall.bat. Hizmeti başlatmak ve durdurmak için <project-name>w.exeçalıştırılabilir dosyayı kullanın .

Yöntem işleme hizmeti başlatmasının, işlemi gerçekleştirmek için ayrı bir iş parçacığı oluşturması ve başlatması ve ardından geri dönmesi gerektiğini unutmayın. Hizmeti başlattığınızda ve durdurduğunuzda ana yöntem farklı iş parçacıklarından çağrılır.

Daha fazla bilgi için lütfen eklenti ve Apache Commons Daemon Procrun'u okuyun.


Yetersiz cevap!
TaylanUB



3

kısayol koymak zorunda olduğunuz için basit

Windows 7 C:\users\All Users\Start Menu\Programs\Startup (Yönetici) veyaUser home directory(%userProfile%)

Windows 10: Çalıştırılıyor shell:startup

özelliğinde -> kısayol -> hedef -> java.exe -jar D:\..\runJar.jar

NOT: Bu yalnızca giriş yaptıktan sonra çalışır


Yönetici Hakkı ile

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

zaman aşımı kullanımı alırsanız, cmd /c D:\JAVA7~1\jdk1.7.0_51\bin\java.exe -jar d:\jenkins\jenkins.warancak bununla bile zaman aşımı alırsınız, ancak arka planda java.exe başlatılır. Görev yöneticisine giriş

NOT: Bu, Windows oturum açma başlangıcında çalışır (oturum açmadan önce, Hizmete göre ' Startup Type')

Windows hizmeti yaratmanın ayrıntılı açıklaması


3

Java 8 ile bu senaryoyu herhangi bir harici araç kullanmadan halledebiliriz. Java 8 ile gelen javapackager aracı, bağımsız uygulama paketleri oluşturma seçeneği sunar:

-native tip Bağımsız uygulama paketleri oluşturun (mümkünse). Kullanılan paketleyicilere argümanlar sağlamak için -B seçeneğini kullanın. Tür belirtilirse, yalnızca bu tür bir paket oluşturulur. Hiçbir tür belirtilmezse, tümü kullanılır.

Aşağıdaki değerler tür için geçerlidir:

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

Windows durumunda aşağıdaki dokümana başvurun, gerekirse msi veya exe oluşturabiliriz.

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

5
Bu cevap soruyu ele almıyor. Javapackager doğrudan bir Windows hizmeti oluşturmak için kullanılamaz, aksine jre ve diğer kaynakları içeren bağımsız bir yürütülebilir dosya oluşturmak için kullanılabilir.
tobias_

3

Glassfish v3 için yazılmış ama genel olarak Java programlarıyla iyi çalışan " winsw " kullanın .

.NET çalışma zamanının yüklü olmasını gerektirir.


Bu arada mevcut sürüm (iyi bilinen Kohsuke Kawaguchi tarafından korunur) burada bulunur .
FrVaBe

Görünüşe göre 1.9 sürümünden sonra github'a taşıdı (büyük olasılıkla Oracle'dan Cloudbees'e gittiğinde).
Thorbjørn Ravn Andersen

2

Ben kullandım JavaService iyi bir başarı ile önce. Birkaç yıl içinde güncellenmedi, ancak kullandığımda oldukça sağlam bir geri dönüştü.


GForge kullanımdan kaldırıldı
lww

2

Java Service Wrapper lisansını beğenmedim. ActiveState Perl ile birlikte çalışarak bir hizmet yazdım.

C # 'da bir hizmet yazmayı düşündüm, ama zaman kısıtlamalarım çok sıkıydı.


"Perl" ile yaptığınız örnek kesmek sağlayabilir ..!
16:32

2

Her zaman sc.exe kullanıyorum (bkz. Http://support.microsoft.com/kb/251192 ). SP1'den XP'ye yüklenmelidir ve Vista lezzetinizde değilse, Vista kaynak kiti ile yükleyebilirsiniz.

Java ile çok karmaşık bir şey yapmadım, ama ya tam nitelikli bir komut satırı argümanı (x: \ java.exe ....) kullanarak ya da Ant ile bir betimleme kullanarak bağımlılıkları dahil etmek ve parametreleri ayarlamak benim için iyi çalışıyor.


1
Bu, hizmet olarak bir şey başlatmanıza izin verir, ancak benim anlayışımla, daha sonra ayrılabilir, yani Hizmetler aracılığıyla durduramaz veya otomatik olarak yeniden başlatamazsınız, vb. Tamamen yanlış olabilirdim - sadece buna bakmaya başladım.
42'de atom atomları

1

Bir başka iyi seçenek de FireDaemon . NASA, IBM gibi bazı büyük mağazalar tarafından kullanılır; tam liste için web sitelerine bakınız.


1

Şu anda bu Eclipse tabanlı bir uygulama çalıştırmak için gerekli ama ilk önce bu uygulama için yerel olan bazı değişkenleri ayarlamanız gerekir. sc.exe yalnızca yürütülebilir dosyalara izin verir ancak komut dosyalarına izin vermez, bu yüzden Windows 2003 kaynak kitinin bir parçası olan autoexnt.exe'ye döndüm . Tek bir toplu iş dosyasına hizmet kısıtlar, ancak bir hizmete dönüştürmek için sadece bir toplu komut dosyası gerekir.

ciao!


-1

Ücretsiz olmasa da Exe4j çok iyi bir seçenektir. Exe4j de göz atın .exe dosyasını oluşturmak için sihirbazda, bir hizmet oluşturma seçeneği vardır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.