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.
Biraz şansım oldu Java Service Wrapper
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.
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!
MyServiceName.exe
ve MyServiceNamew.exe
olarak yeniden adlandırın.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
Ş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
Ş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.
Basit bir yol NSSM Wrapper Wrapper ( blog girişime bakın ).
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).
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:
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.
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.
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
}
}
}
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"
}
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'
}
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.
JavaService , LGPL'dir. Çok kolay ve kararlı. Şiddetle tavsiye edilir.
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.
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ı.
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.
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)
Farklı çözümlerin oldukça iyi bir karşılaştırması şu adreste mevcuttur: http://yajsw.sourceforge.net/#mozTocId2845
Şahsen launch4j gibi
Ben JavaService iyi bir başarı ile daha önce kullandım. Birkaç yıl önce güncellenmedi, ancak kullandığımda oldukça sağlamdı.
Ş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!
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.