it-swarm-vi.tech

Cách tạo một dịch vụ windows từ ứng dụng Java

Tôi vừa thừa hưởng một ứng dụng Java cần được cài đặt như một dịch vụ trên XP và Vista. Đã khoảng 8 năm kể từ khi tôi sử dụng các cửa sổ dưới mọi hình thức và tôi chưa bao giờ phải tạo ra một dịch vụ, chứ đừng nói đến một thứ như ứng dụng Java (Tôi đã có một lọ cho ứng dụng và một lọ phụ thuộc duy nhất - log4j ). Điều kỳ diệu cần thiết để làm cho hoạt động này là một dịch vụ là gì? Tôi đã có nguồn, vì vậy sửa đổi mã, mặc dù tốt nhất nên tránh, là có thể.

207
ideasculptor

Tôi đã có một chút may mắn với Trình bao bọc dịch vụ Java

66
sblundy

Apache Commons Daemon là một lựa chọn tốt. Nó có Procrun cho các dịch vụ windows và Jsvc cho trình nền unix. Nó sử dụng giấy phép Apache ít hạn chế hơn và Apache Tomcat sử dụng nó như một phần của chính nó để chạy trên Windows và Linux! Để làm cho nó hoạt động là một chút khó khăn, nhưng có một bài viết đầy đủ với ví dụ làm việc.

Ngoài ra, bạn có thể xem bin\service.bat trong Apache Tomcat để có ý tưởng về cách thiết lập dịch vụ. Trong Tomcat, họ đổi tên các nhị phân Procrun (prunrv.exe -> Tomcat6.exe, prunmgr.exe -> Tomcat6w.exe).

Một cái gì đó tôi đã vật lộn với việc sử dụng Procrun, các phương thức start and stop của bạn phải chấp nhận các tham số (String [] argv). Ví dụ: "start (String [] argv)" và "stop (String [] argv)" sẽ hoạt động, nhưng "start ()" và "stop ()" sẽ gây ra lỗi. Nếu bạn không thể sửa đổi các cuộc gọi đó, hãy xem xét thực hiện một lớp bootstrapper có thể xoa bóp các cuộc gọi đó để phù hợp với nhu cầu của bạn.

94
mcdon

Với Apache Commons Daemon bây giờ bạn có thể có một tên và biểu tượng thực thi tùy chỉnh! Bạn cũng có thể có một trình giám sát khay Windows tùy chỉnh với tên và biểu tượng của riêng bạn!

Bây giờ tôi có dịch vụ của mình chạy với tên và biểu tượng của riêng tôi (prunrv.exe) và trình giám sát khay hệ thống (prunmgr.exe) cũng có tên và biểu tượng tùy chỉnh của riêng tôi!

  1. Tải xuống nhị phân Apache Commons Daemon (bạn sẽ cần prunrv.exe và prunmgr.exe).
  2. Đổi tên chúng thành MyServiceName.exeMyServiceNamew.exe tương ứng.
  3. Tải xuống WinRun4J và sử dụng chương trình RCEDIT.exe đi kèm để sửa đổi tệp thực thi Apache để nhúng biểu tượng tùy chỉnh của riêng bạn như thế này:

    > RCEDIT.exe /I MyServiceName.exe customIcon.ico
    > RCEDIT.exe /I MyServiceNamew.exe customTrayIcon.ico
    
  4. Bây giờ cài đặt dịch vụ Windows của bạn như thế này (xem tài liệ để biết thêm chi tiết và tùy chọ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. Bây giờ bạn có một dịch vụ Windows của Jar sẽ chạy với biểu tượng và tên của riêng bạn! Bạn cũng có thể khởi chạy tệp màn hình và nó sẽ chạy trong khay hệ thống với biểu tượng và tên của riêng bạn.

53
11101101b

Thêm một lựa chọn nữa là WinRun4J . Đây là một trình khởi chạy Java có thể cấu hình, nhân đôi như một máy chủ dịch vụ windows (cả hai phiên bản 32 và 64 bit). Nó là nguồn mở và không có hạn chế về việc sử dụng nó.

(công bố đầy đủ: tôi làm việc trong dự án này).

25
Peter Smith

Một cách đơn giản là NSSM Wrapper Wrapper ( xem mục blog của tôi ).

25
Giordano Maestro

Một câu trả lời khác là Yet Another Java Service Wrapper , đây có vẻ như là một thay thế tốt cho Trình bao bọc dịch vụ Java vì có giấy phép tốt hơn. Nó cũng được dự định để dễ dàng chuyển từ JSW sang YAJSW. Chắc chắn đối với tôi, hoàn toàn mới đối với các máy chủ windows và cố gắng để ứng dụng Java chạy như một dịch vụ, nó rất dễ sử dụng.

Một số người khác tôi đã tìm thấy, nhưng cuối cùng không sử dụng:

  • Trình khởi chạy dịch vụ Java Tôi đã không sử dụng điều này vì nó hoạt động phức tạp hơn YAJSW. Tôi không nghĩ đây là một cái bọc.
  • JSmooth Tạo các dịch vụ của Window không phải là mục tiêu chính của nó, nhưng có thể được thực hiện . Tôi đã không sử dụng điều này vì không có hoạt động nào kể từ năm 2007.
17
atomicules

Tôi nghĩ rằng Java Service Wrapper hoạt động tốt. Lưu ý rằng có ba cách để tích hợp ứng dụng của bạn. Có vẻ như tùy chọn 1 sẽ hoạt động tốt nhất cho bạn khi bạn không muốn thay đổi mã. Tệp cấu hình có thể hơi điên, nhưng chỉ cần nhớ rằng (đối với tùy chọn 1) chương trình bạn đang bắt đầu và bạn sẽ chỉ định các đối số, là chương trình trợ giúp của chúng, sau đó sẽ khởi động chương trình của bạn. Họ có một ví dụ tệp cấu hình cho việc này.

6
Ed Thomas

JavaService là LGPL. Nó rất dễ dàng và ổn định. Rat khuyen khich.

4
NT_

Nếu bạn sử dụng Gradle Build Tool, bạn có thể thử windows-service-plugin , điều này hỗ trợ sử dụng Apache Commons Daemon Procrun .

Để tạo một ứng dụng dịch vụ cửa sổ Java với plugin, bạn cần trải qua một số bước đơn giản.

  1. Tạo một lớp dịch vụ chính với phương thức thích hợp.

    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. Bao gồm plugin vào tệp build.gradle của bạn.

    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"
    

    Đoạn mã tương tự cho cơ chế plugin mới, ươm tạo, được giới thiệu trong Lớp 2.1:

    plugins {
      id "com.github.alexeylisyutenko.windows-service-plugin" version "1.1.0"
    }
    
  3. Cấu hình 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. Chạy nhiệm vụ cấp độ createdWindowsService để tạo phân phối dịch vụ windows.

Đó là tất cả những gì bạn cần làm để tạo ra một dịch vụ windows đơn giản. Plugin sẽ tự động tải xuống các nhị phân Apache Commons Daemon Procrun, trích xuất các nhị phân này vào thư mục phân phối dịch vụ và tạo các tệp bó để cài đặt/gỡ cài đặt dịch vụ.

Trong thư mục ${project.buildDir}/windows-service, bạn sẽ tìm thấy các tệp thực thi dịch vụ, các tập lệnh bó để cài đặt/gỡ cài đặt dịch vụ và tất cả các thư viện thời gian chạy. Để cài đặt dịch vụ, hãy chạy <project-name>-install.bat và nếu bạn muốn gỡ cài đặt dịch vụ, hãy chạy <project-name>-uninstall.bat. Để bắt đầu và dừng dịch vụ, hãy sử dụng <project-name>w.exe thực thi.

Lưu ý rằng dịch vụ xử lý phương thức bắt đầu nên tạo và bắt đầu một luồng riêng để tiến hành xử lý, sau đó trả về. Phương thức chính được gọi từ các luồng khác nhau khi bạn bắt đầu và dừng dịch vụ.

Để biết thêm thông tin, vui lòng đọc về plugin và Apache Commons Daemon Procrun.

4
Alexey Lisyutenko

Sử dụng " wonw " được viết cho Glassfish v3 nhưng hoạt động tốt với các chương trình Java nói chung.

Yêu cầu thời gian chạy .NET được cài đặt.

3

Với Java 8, chúng ta có thể xử lý tình huống này mà không cần bất kỳ công cụ bên ngoài nào. javapackager công cụ đi kèm với Java 8 cung cấp tùy chọn để tạo các gói ứng dụng độc lập:

-native type Tạo các gói ứng dụng độc lập (nếu có thể). Sử dụng tùy chọn -B để cung cấp đối số cho các gói được sử dụng. Nếu loại được chỉ định, thì chỉ một bó loại này được tạo. Nếu không có loại được chỉ định, tất cả được sử dụng.

Các giá trị sau là hợp lệ cho loại:

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

Trong trường hợp các cửa sổ tham khảo sau doc chúng ta có thể tạo msi hoặc exe khi cần.

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

Tôi không thích việc cấp phép cho Trình bao bọc dịch vụ Java. Tôi đã đi với ActiveState Perl để viết một dịch vụ thực hiện công việc.

Tôi đã nghĩ về việc viết một dịch vụ bằng C #, nhưng hạn chế về thời gian của tôi quá chặt chẽ.

2
Hugh Buchanan

Tôi luôn chỉ sử dụng sc.exe (xem http://support.Microsoft.com/kb/251192 ). Nó nên được cài đặt trên XP từ SP1 và nếu nó không phải là hương vị của Vista, bạn có thể tải xuống tải nó bằng bộ tài nguyên Vista.

Tôi chưa làm gì quá phức tạp với Java, nhưng sử dụng đối số dòng lệnh đủ điều kiện (x:\Java.exe ....) hoặc tạo tập lệnh với Ant để bao gồm các phụ thuộc và đặt tham số hoạt động tốt cho tôi.

2
Kevin

thật đơn giản khi bạn phải đặt phím tắt

Windows 7 C:\users\All Users\Start Menu\Programs\Startup (Quản trị viên) hoặc User home directory(%userProfile%)

Windows 10: Đang chạy Shell:startup

trong thuộc tính của nó -> phím tắt -> đích -> Java.exe -jar D:\..\runJar.jar

LƯU Ý: Điều này sẽ chỉ chạy sau khi bạn đăng nhập


Với quyền quản trị viên

sc create serviceName binpath= "Java.exe -jar D:\..\runJar.jar" Sẽ tạo dịch vụ windows

nếu bạn nhận được thời gian chờ , hãy sử dụng cmd /c D:\Java7~1\jdk1.7.0_51\bin\Java.exe -jar d:\jenkins\jenkins.war nhưng ngay cả với điều này, bạn sẽ nhận được thời gian chờ nhưng trong nền Java.exe sẽ được bắt đầu. Kiểm tra trong quản lý công việc

LƯU Ý: Điều này sẽ chạy khi khởi động đăng nhập windows (trước khi đăng nhập, Dựa trên dịch vụ 'Startup Type')

Giải thích chi tiết về việc tạo dịch vụ windows

2
Ravi Parekh

Một so sánh khá tốt về các giải pháp khác nhau có sẵn tại: http://yajsw.sourceforge.net/#mozTocId2845

Cá nhân như launch4j

2
pushNpop

Tôi đã sử dụng JavaService trước đây với thành công tốt đẹp. Nó đã không được cập nhật trong một vài năm, nhưng tôi đã sử dụng nó khá tốt.

2
Jason

Tôi hiện đang yêu cầu điều này để chạy một ứng dụng dựa trên Eclipse nhưng tôi cần đặt một số biến đầu tiên là cục bộ cho ứng dụng đó. sc.exe sẽ chỉ cho phép thực thi chứ không phải tập lệnh nên tôi đã chuyển sang autoexnt.exe, một phần của bộ tài nguyên Windows 20 . Nó giới hạn dịch vụ trong một tệp bó duy nhất nhưng tôi chỉ cần một tập lệnh bó để được chuyển đổi thành dịch vụ.

ciao!

1
ramfree17

Một lựa chọn tốt khác là FireDaemon . Nó được sử dụng bởi một số cửa hàng lớn như NASA, IBM, v.v; xem trang web của họ cho một danh sách đầy đủ.

1
Andrew Swan