it-swarm-id.com

Cara membuat layanan windows dari aplikasi Java

Saya baru saja mewarisi aplikasi Java yang perlu diinstal sebagai layanan pada 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 toples untuk aplikasi dan jar ketergantungan tunggal - log4j). Apa keajaiban yang diperlukan untuk menjalankan ini sebagai layanan? Saya sudah mendapatkan sumbernya, jadi modifikasi kode, meskipun sebaiknya dihindari, dimungkinkan.

211
ideasculptor

Saya beruntung dengan the Java Service Wrapper

66
sblundy

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

95
mcdon

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 memerlukan prunsrv.exe dan prunmgr.exe).
  2. Ubah nama mereka menjadi MyServiceName.exe dan MyServiceNamew.exe masing-masing.
  3. Unduh WinRun4J dan gunakan program RCEDIT.exe 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 berjalan 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.

54
11101101b

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

26
Giordano Maestro

Satu opsi lagi adalah WinRun4J . Ini adalah launcher Java yang dapat dikonfigurasi yang juga berfungsi sebagai Host layanan windows (keduanya versi 32 dan 64 bit). Ini adalah open source dan tidak ada batasan dalam penggunaannya.

(pengungkapan penuh: Saya mengerjakan proyek ini).

25
Peter Smith

Namun jawaban lain adalah Yet Another Java Service Wrapper , ini sepertinya alternatif yang baik untuk Java Service Wrapper karena memiliki perizinan 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:

  • Java Service Launcher Saya tidak menggunakan ini karena terlihat lebih rumit untuk bekerja daripada YAJSW. Saya tidak berpikir ini bungkus.
  • JSmooth Membuat layanan Window bukan tujuan utamanya, tetapi dapat dilakukan . Saya tidak menggunakan ini karena tidak ada aktivitas sejak 2007.
17
atomicules

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.

6
Ed Thomas

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

Untuk membuat aplikasi layanan windows Java 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 file build.gradle 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 createWindowsService tugas gradle 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 direktori ${project.buildDir}/windows-service Anda akan menemukan executable layanan, skrip batch untuk instalasi/penghapusan instalasi layanan dan semua pustaka runtime. Untuk menginstal layanan jalankan <project-name>-install.bat dan jika Anda ingin menghapus instalasi layanan <project-name>-uninstall.bat. Untuk memulai dan menghentikan layanan gunakan <project-name>w.exe dapat dieksekusi.

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.

5

JavaService adalah LGPL. Sangat mudah dan stabil. Sangat dianjurkan.

4
NT_

Dengan Java 8 kita dapat menangani skenario ini tanpa alat eksternal. javapackager alat yang datang dengan Java 8 menyediakan opsi untuk membuat bundel aplikasi yang lengkap:

-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 doc berikut kita dapat membuat msi atau exe sesuai kebutuhan.

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

Gunakan " winsw " yang ditulis untuk Glassfish v3 tetapi bekerja dengan baik dengan program Java secara umum.

Membutuhkan .NET runtime diinstal.

Saya tidak suka lisensi untuk Java Pembungkus Layanan. Saya menggunakan ActiveState Perl untuk menulis layanan yang berfungsi.

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

2
Hugh Buchanan

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.

2
Kevin

itu sederhana karena Anda harus memasukkan jalan pintas

Windows 7 C:\users\All Users\Start Menu\Programs\Startup (Admin) atau User 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 Hak Admin

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

jika Anda mendapatkan batas waktu gunakan cmd /c D:\Java7~1\jdk1.7.0_51\bin\Java.exe -jar d:\jenkins\jenkins.war tetapi 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

2
Ravi Parekh

Perbandingan yang cukup bagus dari berbagai solusi tersedia di: http://yajsw.sourceforge.net/#mozTocId2845

Secara pribadi suka launch4j

2
pushNpop

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

2
Jason

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 20 . Ini membatasi layanan ke file batch tunggal tetapi saya hanya perlu satu skrip batch untuk dikonversi menjadi layanan.

ciao!

1
ramfree17

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

1
Andrew Swan