it-swarm-tr.com

Java app'den bir windows servisi nasıl oluşturulur?

Az önce Java ve Vista'da hizmet olarak yüklenmesi gereken bir XP uygulamasını aldım. Pencereleri herhangi bir biçimde kullanmaya başladığımdan bu yana 8 yıl geçti ve hiçbir zaman bir hizmet oluşturmak zorunda kalmamıştım, bir Java uygulaması gibi bir şey olsa bile tek bir bağımlılık kavanozu - log4j). Bunu bir hizmet olarak çalıştırmak için gereken sihir nedir? Kaynağa sahibim, bu yüzden tercihen kaçınılmasına rağmen kod değişiklikleri mümkün.

211
ideasculptor

Biraz şansım oldu Java Service Wrapper

66
sblundy

Apache Commons Daemon iyi bir alternatif. Windows hizmetleri için Procrun , ve unix daemons için Jsvc vardır. Daha az kısıtlayıcı Apache lisansı kullanıyor ve Apache Tomcat Windows ve Linux'ta çalıştırmak için onu bir parçası olarak kullanıyor! Çalışması için biraz zor, ama çalışma örneğinde ayrıntılı bir makale var.

Bunun yanında, hizmetin nasıl kurulacağı hakkında bir fikir edinmek için bin\service.bat Apache Tomcat içinde bakabilirsiniz. Tomcat'te Procrun ikili dosyalarını yeniden adlandırırlar (prunsrv.exe -> Tomcat6.exe, prunmgr.exe -> Tomcat6w.exe).

Procrun kullanmakta zorlandığım bir şey, start ve stop yöntemlerinin parametreleri kabul etmesi gerekir (String [] argv). Örneğin, "start (String [] argv)" ve "stop (String [] argv)" çalışır, ancak "start ()" ve "stop ()" hatalara neden olur. Bu aramaları değiştiremezseniz, bu aramaları gereksinimlerinize uyacak şekilde masajlayabilecek bir bootstrapper sınıfı oluşturmayı düşünün.

95
mcdon

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

Artık hizmetim kendi adım ve ikonumla (prunsrv.exe) çalışıyor ve sistem tepsisi monitöründe (prunmgr.exe) ayrıca kendi özel adım ve simge var!

  1. Download (Apache Commons Daemon binaries (prunsrv.exe ve prunmgr.exe'ye ihtiyacınız olacak).
  2. Bunları sırasıyla MyServiceName.exe ve MyServiceNamew.exe olarak yeniden adlandırın.
  3. Download WinRun4J ve kendi özel simgenizi bu şekilde gömmek için Apache çalıştırılabilir öğelerini değiştirmek üzere gelen RCEDIT.exe programını kullanın:

    > RCEDIT.exe /I MyServiceName.exe customIcon.ico
    > RCEDIT.exe /I MyServiceNamew.exe customTrayIcon.ico
    
  4. Şimdi Windows hizmetinizi bu şekilde kurun (daha fazla ayrıntı ve seçenek için bakınız belgeler ):

    > 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. Şimdi kendi ikonunuz ve adınızla çalışacak olan bir Jar Windows servisine sahipsiniz! Monitör dosyasını da başlatabilirsiniz; sistem tepsisinde kendi simge ve adınızla çalışacaktır.

54
11101101b

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

26
Giordano Maestro

Bir seçenek daha WinRun4J . Bu, yapılandırılabilir bir Java başlatıcısı olup, bir Windows hizmeti Ana Bilgisayarı görevi görür (hem 32, hem de 64 bit sürümleri). Açık kaynaktır ve kullanımı ile ilgili herhangi bir kısıtlama yoktur.

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

25
Peter Smith

Yine başka bir cevap Yine Başka _ Java Hizmet Paketleyici , bu daha iyi lisanslamaya sahip olarak Java Hizmet Paketleyicisine iyi bir alternatif gibi görünüyor. Ayrıca JSW'den YAJSW'ye taşınması kolay olması amaçlanmıştır. Kesinlikle benim için, windows sunucularında yepyeni ve bir servis olarak çalışan bir Java uygulaması almaya çalışırken, kullanımı çok kolaydı.

Bulduğum, ancak kullanamadığım bazı kişiler:

  • Java Service Launcher Bunu kullanmadım, çünkü YAJSW'den çalışmak için daha karmaşık görünüyordu. Bunun bir sarmalayıcı olduğunu sanmıyorum.
  • JSmooth Window hizmetlerini oluşturmak birincil amacı değildir, ancak yapılabilir . Bunu kullanmadım, çünkü 2007'den beri bir faaliyet olmadı.
17
atomicules

Bence Java Servis Sarıcı iyi çalışıyor. Uygulamanızı entegre etmek için üç yol olduğunu unutmayın. Kod 1'i değiştirmek istemediğinize göre, seçenek 1 sizin için en iyi şekilde çalışacaktır. Yapılandırma dosyası biraz çılgına dönebilir, ancak şunu unutmayın: (seçenek 1 için) başlattığınız ve bağımsız değişkenleri belirleyeceğiniz programın yardımcı programı olduğunu ve ardından programınızı başlatacağını unutmayın. Bunun için bir örnek yapılandırma dosyası var.

6
Ed Thomas

Gradle Build Tool kullanıyorsanız (Apache Commons Daemon Procrun kullanımını kolaylaştıran benim windows-service-plugin komutunu deneyebilirsiniz.

Eklentili bir Java windows servis uygulaması oluşturmak için birkaç basit adımı atmanız gerekir.

  1. Uygun yöntemle bir ana servis 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.gradle dosyanı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, inkübe eden, eklenti mekanizması için aynı script pasajı:

    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 hizmet dağıtımı oluşturmak için createWindowsService gradle görevini çalıştırın.

Basit bir pencere servisi oluşturmak için yapmanız gereken tek şey bu. Eklenti, Apache Commons Daemon Procrun ikili dosyalarını otomatik olarak indirecek, bu ikili dosyaları servis dağıtım dizinine çıkaracak ve servisin kurulumu/kaldırılması için toplu dosyalar oluşturacaktır.

${project.buildDir}/windows-service dizininde servis çalıştırılabilirleri, servisin kurulumu/kaldırılması için toplu komut dosyaları ve tüm çalışma zamanı kitaplıklarını bulacaksınız. Hizmeti kurmak için <project-name>-install.bat komutunu çalıştırın ve servisi kaldırmak istiyorsanız <project-name>-uninstall.bat komutunu çalıştırın. Hizmeti başlatmak ve durdurmak için <project-name>w.exe yürütülebilir dosyasını kullanın.

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

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

5

JavaService , LGPL'dir. Çok kolay ve kararlı. Şiddetle tavsiye edilir.

4
NT_

Java 8 ile bu senaryoyu herhangi bir harici araç kullanmadan halledebiliriz. javapackager Java 8 ile gelen araç, kendine yeten uygulama paketleri oluşturma seçeneği sunar:

-native type Kendi kendine yeten uygulama paketlerini oluşturun (mümkünse). Kullanılan donatıcılara argümanlar sağlamak için -B seçeneğini kullanın. Eğer tip belirtilirse, o zaman sadece bu tipte bir demet oluşturulur. Tür belirtilmemişse, 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.

Pencerelerde aşağıdakilere bakın doc gerektiği gibi msi veya exe oluşturabiliriz.

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

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

Yüklü .NET çalışma zamanı gerektir.

Java Service Wrapper lisansını beğenmedim. İşi yapan bir servis yazmak için ActiveState Perl ile gittim.

C # dilinde bir servis yazmayı düşündüm, fakat zaman kısıtlarım çok dardı.

2
Hugh Buchanan

Her zaman sadece sc.exe kullanıyorum (bakınız http://support.Microsoft.com/kb/251192 ). SP1'den XP üzerine yüklenmeli ve Vista'nın tadında değilse, Vista kaynak kiti ile yükleyebilirsiniz.

Java ile çok karmaşık bir şey yapmadım, ancak ya tam bir komut satırı argümanı (x:\Java.exe ....) kullanarak ya da bağımlılıkları eklemek ve parametreleri ayarlamak için Ant ile bir komut dosyası oluşturmak benim için iyi sonuç veriyor.

2
Kevin

kısayol koymak zorunda olduğunuz kadar basit

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

Windows 10: Çalışmada Shell:startup

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

NOT: Bu yalnızca oturum açtıktan sonra çalışacaktır


Yönetici Hakkı ile

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

alırsanız zaman aşımı cmd /c D:\Java7~1\jdk1.7.0_51\bin\Java.exe -jar d:\jenkins\jenkins.war kullanın, ancak bununla zaman aşımına uğrarsınız ancak arka planda Java.exe başlatılır. Görev yöneticisine giriş yap

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

Windows servisi oluşturmanın ayrıntılı açıklaması

2
Ravi Parekh

Farklı çözümlerin oldukça iyi bir karşılaştırması şu adreste mevcuttur: http://yajsw.sourceforge.net/#mozTocId2845

Şahsen launch4j gibi

2
pushNpop

Ben JavaService iyi bir başarı ile daha önce kullandım. Birkaç yıl önce güncellenmedi, ancak kullandığımda oldukça sağlamdı.

2
Jason

Şu anda bunun Eclipse tabanlı bir uygulamayı çalıştırmasını zorunlu tutuyorum ancak önce o uygulamaya yerel olan bazı değişkenleri ayarlamam gerekiyor. sc.exe yalnızca çalıştırılabilir dosyalara izin verir, komut dosyalarına izin vermez, bu yüzden Windows 2003 kaynak setinin bir parçası olan autoexnt.exe'ye döndüm. Hizmeti tek bir toplu iş dosyasıyla sınırlandırıyor, ancak bir hizmete dönüştürülmesi için yalnızca bir toplu iş komut dosyasına ihtiyacım var.

ciao!

1
ramfree17

Başka bir iyi seçenek ise FireDaemon . NASA, IBM, vb. Bazı büyük dükkanlar tarafından kullanılır; tam liste için kendi web sitesine bakın.

1
Andrew Swan