Cara membuat layanan windows dari aplikasi java

220

Saya baru saja mewarisi aplikasi java yang perlu diinstal sebagai layanan di XP dan vista. Sudah sekitar 8 tahun sejak saya menggunakan windows dalam bentuk apa pun dan saya tidak pernah harus membuat layanan, apalagi dari sesuatu seperti aplikasi java (saya punya botol untuk aplikasi dan satu botol ketergantungan) - log4j ). Apa keajaiban yang diperlukan untuk menjalankan ini sebagai layanan? Saya punya sumbernya, jadi modifikasi kode, meskipun sebaiknya dihindari, dimungkinkan.

ideasculptor
sumber
1
Hanya untuk kelengkapan: di sini serverfault.com/a/259195 dikatakan aplikasi perlu menanggapi panggilan balik Manajer Kontrol Layanan. Baca tutorial ini menggunakan Procrun ticklingmind.blogspot.com/2010/03/...
Broken_Window
Jawaban lain stackoverflow.com/questions/5953525/…
Ravi Parekh

Jawaban:

69

Saya beruntung dengan Java Service Wrapper

merah muda
sumber
11
Wrapper Layanan Java terlihat sangat berguna. Tapi saya melihat daftar fitur. Anda hanya perlu menyadari bahwa versi komunitas tidak berlisensi untuk digunakan di server.
Brian Matthews
Itu bisa menjadi masalah. Beberapa tahun yang lalu saya menggunakannya. Kira mereka memutuskan untuk menagih.
sblundy
Wrapper ini digunakan oleh banyak proyek open source, termasuk beberapa di Jakarta Apache, seperti ActiveMQ.
Todd
7
wrapper.tanukisoftware.org/doc/english/licenseCommunity.html Penggunaan Sumber Tertutup GPL tidak membatasi perangkat lunak pribadi untuk dikembangkan untuk penggunaan internal yang tergantung pada perangkat lunak di bawah GPL selama perangkat lunak itu tidak pernah didistribusikan tanpa membuat sumber penuh dari seluruh aplikasi tersedia untuk semua pengguna. Meskipun kami mendorong pengguna korporat dan pemerintah untuk menggunakan Server atau Perjanjian Lisensi Pengembangan, Perjanjian Lisensi Komunitas dapat diterima selama aplikasi tersebut untuk penggunaan internal atau akan selalu didistribusikan bersama dengan src penuh.
Vladimir
1
@Vladimir tanuki wrapper tidak lagi bersumber terbuka untuk lengkungan 64bit
gerrytan
100

Apache Commons Daemon adalah alternatif yang baik. Ini memiliki Procrun untuk layanan windows, dan Jsvc untuk unix daemon. Ia menggunakan lisensi Apache yang tidak terlalu ketat, dan Apache Tomcat menggunakannya sebagai bagian dari dirinya untuk dijalankan di Windows dan Linux! Untuk membuatnya bekerja agak sulit, tetapi ada artikel lengkap dengan contoh kerja.

Selain itu, Anda dapat melihat bin \ service.bat di Apache Tomcat untuk mendapatkan ide cara mengatur layanan. Di Tomcat mereka mengganti nama binari Procrun (prunsrv.exe -> tomcat6.exe, prunmgr.exe -> tomcat6w.exe).

Sesuatu yang saya perjuangkan menggunakan Procrun, metode start dan stop Anda harus menerima parameter (String [] argv). Misalnya "start (String [] argv)" dan "stop (String [] argv)" akan berfungsi, tetapi "start ()" dan "stop ()" akan menyebabkan kesalahan. Jika Anda tidak dapat mengubah panggilan-panggilan itu, pertimbangkan untuk membuat kelas bootstrapper yang dapat memijat panggilan-panggilan itu sesuai dengan kebutuhan Anda.

mcdon
sumber
Dengan menggunakan refleksi, Anda mungkin bisa menyelesaikan masalah yang Anda nyatakan di paragraf terakhir. Juga, apache commons daemon adalah satu-satunya pembungkus yang saya tahu yang memiliki binari 64-bit yang sudah dibuat sebelumnya untuk digunakan secara gratis.
djangofan
Anda membutuhkan carriage return antara masing-masing Opsi JVM. Sebagai contoh jika Anda memiliki pada baris yang sama -Dopt1 = a -Dopt2 = b, itu mungkin tidak berfungsi. Untuk memperbaikinya Anda perlu menulis --JvmOptions=-Dopt=a#-Dopt2=b. Saya menjalankan perintah dari naskah semut dan berjuang selama berhari-hari karenanya. Semoga ini bisa membantu.
Sydney
Artikel yang Anda bicarakan sudah tidak ada ... Apakah Anda masih memiliki cara untuk mencapainya? Saya kesulitan mendapatkan Apache Commons Daemon untuk melakukan apa yang saya butuhkan.
11101101b
3
@ 11101101b, apache tampaknya telah menempelkan isi artikel ke halaman wiki sendiri ...
Lucas
@komunitas wiki, saya menggunakan Apache Commons Daemon untuk mesin windows 64-bit, berhasil menambahkan layanan. sementara saya menggunakan proses yang sama untuk mesin windows 7 32-bit gagal untuk menambahkan layanan.
Shakthi
59

Dengan Apache Commons Daemon Anda sekarang dapat memiliki nama dan ikon yang dapat dieksekusi kustom! Anda juga bisa mendapatkan monitor baki Windows khusus dengan nama dan ikon Anda sendiri!

Saya sekarang memiliki layanan saya berjalan dengan nama dan ikon saya sendiri (prunsrv.exe), dan monitor system tray (prunmgr.exe) juga memiliki nama dan ikon kustom saya sendiri!

  1. Unduh binari Apache Commons Daemon (Anda perlu prunsrv.exe dan prunmgr.exe).
  2. Ubah nama mereka menjadi MyServiceName.exedan MyServiceNamew.exemasing - masing.
  3. Unduh WinRun4J dan gunakan RCEDIT.exeprogram yang menyertainya untuk memodifikasi executable Apache untuk menyematkan ikon kustom Anda sendiri seperti ini:

    > RCEDIT.exe /I MyServiceName.exe customIcon.ico
    > RCEDIT.exe /I MyServiceNamew.exe customTrayIcon.ico
  4. Sekarang instal layanan Windows Anda seperti ini (lihat dokumentasi untuk detail dan opsi lebih lanjut):

    > 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. Sekarang Anda memiliki layanan Windows dari Jar Anda yang akan dijalankan dengan ikon dan nama Anda sendiri! Anda juga dapat meluncurkan file monitor dan itu akan berjalan di baki sistem dengan ikon dan nama Anda sendiri.

11101101b
sumber
1
Saya melakukan segalanya sesuai dengan Cara Anda, tetapi itu tidak mengubah ikon systray .. tahu kenapa?
outofBounds
Maaf @outofBounds, saya tidak melihat komentar Anda sampai sekarang. Program RCEDIT.exe adalah yang memodifikasi ikon layanan Anda yang dapat dieksekusi. Pastikan Anda memiliki file .ico yang valid dengan ukuran masing-masing ditentukan dengan benar. Anda dapat melihat cara membuat file .ico yang tepat di sini: stackoverflow.com/questions/4354617/...
11101101b
2
Asal tahu saja, Anda tidak dapat memiliki spasi dalam nama layanan.
11101101b
1
Ya @Shakthi berfungsi dengan baik pada Windows XP 32 dan 64-bit, 7, 8, 8.1, Server 2003, 2008, dan 2012.
11101101b
1
Ya, @Syamsoul Azrein, berfungsi dengan baik pada 10 dan edisi server apa pun.
11101101b
31

Cara sederhana adalah Pembungkus NSSM ( lihat entri blog saya ).

Giordano Maestro
sumber
7
NSSM ROCKS! Saya mudah membuat wrapper bahkan dari program java saya. Mudah, ringan, bekerja - 100kb kebahagiaan! Terima kasih!
cynepnaxa
1
Contoh apa saja, bagaimana cara menggunakan NSSM Wrapper untuk memulai aplikasi java (saya menggunakan HelioSearch) misalnya sebagai layanan windows di latar belakang saat sistem start-up?
Krunal
@GiordanoMaestro, entri blog Anda tidak dapat diakses lagi. Apakah Anda memiliki tautan lain?
Matthieu
2
Dibandingkan dengan Apache Commons Daemon, wrapper.tanukisoftware.org, & yajsw, NSSM sejauh ini merupakan pilihan tercepat & termudah untuk mengubah aplikasi java sederhana menjadi layanan windows
Jeffrey Knight
Saya mencoba menggunakan NSSM untuk menjalankan toples boot spring yang dapat dieksekusi. Saya mendapatkan kesalahan ini, "Status tak terduga SERVICE_PAUSED sebagai respons terhadap kontrol START."
Kiran Kumar
26

Satu opsi lagi adalah WinRun4J . Ini adalah peluncur java yang dapat dikonfigurasi yang berfungsi sebagai host layanan windows (versi 32 dan 64 bit). Ini adalah open source dan tidak ada batasan dalam penggunaannya.

(pengungkapan penuh: Saya mengerjakan proyek ini).

Peter Smith
sumber
3
Terima kasih untuk ini. Saya sudah mencoba YAJWS dan pertama-tama itu membuat saya takut dengan unduhan 19MB, dan setelah saya mengikuti instruksi itu menunjukkan "error parsing command line". Saya telah melihat PROCRUN dan terlalu rumit untuk pengaturan yang cepat. INSTSRV / SRVANY membutuhkan perubahan registri! Launch4J mengemas JAR di dalam EXE, sehingga mempersulit penerapan. WinRun4J sangat pas. Satu-satunya kelemahan adalah bahwa ia membutuhkan kelas khusus untuk bekerja sebagai layanan (bukan hanya memanggil kelas utama standar). Tapi secara keseluruhan 99% sempurna.
fernacolo
2
FYI, versi terbaru memiliki pembungkus untuk kelas utama standar.
Peter Smith
Hai, Bisakah Anda memberikan contoh yang menjelaskan cara menggunakan ini? Saya ingin menggunakannya untuk memulai contoh HelioSearch sebagai layanan latar belakang windows pada startup sistem.
Krunal
17

Namun jawaban lain adalah Yet Another Service Wrapper , ini sepertinya alternatif yang baik untuk Java Service Wrapper karena memiliki lisensi yang lebih baik. Ini juga dimaksudkan agar mudah berpindah dari JSW ke YAJSW. Bagi saya, merek baru di windows server dan mencoba menjalankan aplikasi Java sebagai layanan, itu sangat mudah digunakan.

Beberapa yang lain saya temukan, tetapi tidak menggunakan:

  • Peluncur Layanan Java Saya tidak menggunakan ini karena terlihat lebih rumit untuk bekerja daripada YAJSW. Saya tidak berpikir ini bungkus.
  • Layanan JSmooth Creating Window bukanlah tujuan utamanya, tetapi dapat dilakukan . Saya tidak menggunakan ini karena tidak ada aktivitas sejak 2007.
atomicules
sumber
+1 dari saya karena ini adalah solusi tercepat untuk saya "di luar kotak" dan tidak ada modifikasi aplikasi java yang diperlukan yang merupakan nilai tambah pasti.
Green Day
Saya menemukan grafik perbandingan yang sangat menarik ini yang membandingkan YAJSW dengan beberapa pembungkus layanan umum lainnya. yajsw.sourceforge.net/#mozTocId284533
Green
6

Saya pikir Java Service Wrapper berfungsi dengan baik. Perhatikan bahwa ada tiga cara untuk mengintegrasikan aplikasi Anda. Kedengarannya seperti opsi 1 akan bekerja paling baik untuk Anda mengingat Anda tidak ingin mengubah kode. File konfigurasi bisa menjadi sedikit gila, tetapi ingatlah bahwa (untuk opsi 1) program yang Anda mulai dan yang akan Anda tentukan argumennya, adalah program pembantu mereka, yang kemudian akan memulai program Anda. Mereka memiliki contoh file konfigurasi untuk ini.

Ed Thomas
sumber
5

Jika Anda menggunakan Gradle Build Tool, Anda dapat mencoba plugin windows-service-plugin saya , yang memfasilitasi penggunaan Apache Commons Daemon Procrun .

Untuk membuat aplikasi layanan java windows dengan plugin Anda harus melalui beberapa langkah sederhana.

  1. Buat kelas layanan utama dengan metode yang sesuai.

    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. Sertakan plugin ke dalam build.gradlefile Anda .

    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"

    Cuplikan skrip yang sama untuk mekanisme plugin baru, yang menginkubasi, yang diperkenalkan di Gradle 2.1:

    plugins {
      id "com.github.alexeylisyutenko.windows-service-plugin" version "1.1.0"
    }
  3. Konfigurasikan 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. Jalankan tugas grader createWindowsService untuk membuat distribusi layanan windows.

Itu semua yang perlu Anda lakukan untuk membuat layanan windows sederhana. Plugin akan secara otomatis mengunduh binari Apache Commons Daemon Procrun, mengekstrak binari ini ke direktori distribusi layanan dan membuat file batch untuk instalasi / penghapusan instalasi layanan.

Dalam ${project.buildDir}/windows-servicedirektori Anda akan menemukan executable layanan, skrip batch untuk instalasi / penghapusan layanan dan semua pustaka runtime. Untuk menginstal menjalankan layanan <project-name>-install.batdan jika Anda ingin menghapus instalasi menjalankan layanan <project-name>-uninstall.bat. Untuk memulai dan menghentikan layanan gunakan <project-name>w.exeexecutable.

Perhatikan bahwa metode layanan penanganan mulai harus membuat dan memulai utas terpisah untuk melakukan pemrosesan, dan kemudian kembali. Metode utama dipanggil dari utas berbeda ketika Anda memulai dan menghentikan layanan.

Untuk informasi lebih lanjut, silakan baca tentang plugin dan Apache Commons Daemon Procrun.

Alexey Lisyutenko
sumber
Jawaban yang diremehkan!
TaylanUB
4

Dengan Java 8 kita dapat menangani skenario ini tanpa alat eksternal. javapackageralat datang dengan java 8 menyediakan opsi untuk membuat bundel aplikasi mandiri:

-jenis asli Menghasilkan bundel aplikasi mandiri (jika mungkin). Gunakan opsi -B untuk memberikan argumen kepada bundler yang digunakan. Jika jenisnya ditentukan, maka hanya satu bundel dari jenis ini yang dibuat. Jika tidak ada tipe yang ditentukan, semua digunakan.

Nilai-nilai berikut ini valid untuk tipe:

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

Dalam hal windows merujuk dokumen berikut kita dapat membuat msi atau exe sesuai kebutuhan.

exe: Generates a Windows .exe package.
msi: Generates a Windows Installer package.
Steephen
sumber
4
Jawaban ini tidak menjawab pertanyaan. Javapackager tidak dapat digunakan untuk membuat layanan windows secara langsung, melainkan membuat self executable yang mis. Termasuk jre dan sumber daya lainnya.
tobias_
3

itu sederhana karena Anda harus memasukkan jalan pintas

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

Windows 10: Di Jalankan shell:startup

di properti itu -> jalan pintas -> target -> java.exe -jar D:\..\runJar.jar

CATATAN: Ini hanya akan berjalan setelah Anda masuk


Dengan Admin Right

sc create serviceName binpath= "java.exe -jar D:\..\runJar.jar" Akan membuat layanan windows

jika Anda mendapatkan batas waktu penggunaan cmd /c D:\JAVA7~1\jdk1.7.0_51\bin\java.exe -jar d:\jenkins\jenkins.wartetapi bahkan dengan ini Anda akan mendapatkan batas waktu tetapi di latar belakang java.exe akan dimulai. Manajer tugas check-in

CATATAN: Ini akan berjalan pada windows logon start-up (sebelum masuk, Berdasarkan layanan ' Startup Type')

Penjelasan terperinci tentang membuat layanan windows

Ravi Parekh
sumber
3

Gunakan " winsw " yang ditulis untuk Glassfish v3 tetapi bekerja dengan baik dengan program Java pada umumnya.

Membutuhkan .NET runtime diinstal.

Thorbjørn Ravn Andersen
sumber
Sementara versi saat ini (dikelola oleh Kohsuke Kawaguchi yang terkenal) terletak di sini .
FrVaBe
Tampaknya dia memindahkannya ke github setelah versi 1.9 (kemungkinan besar ketika dia pergi dari Oracle ke Cloudbees).
Thorbjørn Ravn Andersen
2

Saya telah menggunakan JavaService sebelumnya dengan kesuksesan yang baik. Itu belum diperbarui dalam beberapa tahun, tetapi cukup solid kembali ketika saya menggunakannya.


sumber
GForge telah dihentikan
lww
2

Saya tidak suka lisensi untuk Java Service Wrapper. Saya menggunakan ActiveState Perl untuk menulis layanan yang berfungsi.

Saya berpikir untuk menulis layanan dalam C #, tetapi kendala waktu saya terlalu ketat.

Hugh Buchanan
sumber
Bisakah Anda memberikan contoh hack yang telah Anda lakukan dengan "perl" ..!
peaceUser
2

Saya selalu menggunakan sc.exe (lihat http://support.microsoft.com/kb/251192 ). Itu harus diinstal pada XP dari SP1, dan jika itu tidak sesuai keinginan Anda dari Vista, Anda dapat mengunduh memuatnya dengan kit sumber daya Vista.

Saya belum melakukan sesuatu yang terlalu rumit dengan Java, tetapi menggunakan argumen baris perintah yang sepenuhnya memenuhi syarat (x: \ java.exe ....) atau membuat skrip dengan Ant untuk menyertakan depencies dan mengatur parameter berfungsi dengan baik untuk saya.

Kevin
sumber
1
Itu memungkinkan Anda untuk memulai sesuatu sebagai layanan, tetapi dalam pemahaman saya itu kemudian akan terlepas, yaitu Anda tidak dapat menghentikannya melalui Layanan atau memulai ulang secara otomatis, dll. Namun saya bisa sepenuhnya salah - baru saja mulai menyelidiki hal ini.
atomic
1

Opsi bagus lainnya adalah FireDaemon . Ini digunakan oleh beberapa toko besar seperti NASA, IBM, dll; lihat situs web mereka untuk daftar lengkap.

Andrew Swan
sumber
1

Saat ini saya memerlukan ini untuk menjalankan aplikasi berbasis Eclipse tetapi saya perlu mengatur beberapa variabel terlebih dahulu yang bersifat lokal untuk aplikasi itu. sc.exe hanya akan memungkinkan executable tetapi bukan skrip jadi saya beralih ke autoexnt.exe yang merupakan bagian dari kit sumber daya Windows 2003 . Ini membatasi layanan ke file batch tunggal tetapi saya hanya perlu satu skrip batch untuk dikonversi menjadi layanan.

ciao!


sumber
-1

Exe4j adalah pilihan yang sangat bagus meskipun tidak gratis. Lihat di Exe4j Pada panduan untuk membuat file .exe, Anda diberikan opsi untuk membuat layanan.

Ram
sumber