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


220

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 ). Phép thuật 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ể.


Một đề xuất khác stackoverflow.com/a/9262081/381897
bhdrkn

1
Chỉ để hoàn thiện: ở đây serverfault.com/a/259195 nó nói ứng dụng cần đáp ứng các cuộc gọi lại của Trình điều khiển dịch vụ. Đọc hướng dẫn này, nó sử dụng Procrun ticklingmind.blogspot.com/2010/03/
Kẻ

Câu trả lời:


69

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


11
Java Service Wrapper trông rất hữu ích. Nhưng tôi đã xem danh sách tính năng. Bạn sẽ chỉ cần biết rằng phiên bản cộng đồng không được cấp phép sử dụng trên máy chủ.
Brian Matthews

Đó có thể là một vấn đề. Đó là một vài năm trước tôi đã sử dụng nó. Đoán họ quyết định tính phí.
sblundy

Trình bao bọc này được sử dụng bởi rất nhiều dự án nguồn mở, bao gồm một số dự án trên Jakarta Apache, như ActiveMQ.
Todd

7
Wrapper.tanukisoftware.org/doc/english/licenseCommunity.html Sử dụng nguồn đóng GPL không hạn chế phần mềm riêng được phát triển để sử dụng nội bộ, phụ thuộc vào phần mềm theo GPL miễn là phần mềm đó không bao giờ được phân phối mà không tạo ra nguồn đầy đủ toàn bộ ứng dụng có sẵn cho tất cả người dùng. Mặc dù chúng tôi khuyến khích người dùng doanh nghiệp và chính phủ sử dụng Thỏa thuận cấp phép máy chủ hoặc phát triển, Thỏa thuận cấp phép cộng đồng được chấp nhận miễn là ứng dụng được sử dụng nội bộ hoặc sẽ luôn được phân phối cùng với src đầy đủ của nó.
Vladimir

1
Trình bao bọc @Vladimir tanuki không còn mở nguồn cho vòm 64 bit
gerrytan

100

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 unix daemon. 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 bắt đầu và dừng 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.


Sử dụng sự phản chiếu, bạn có thể có thể giải quyết vấn đề bạn đã nêu trong đoạn cuối của bạn. Ngoài ra, apache commons daemon là trình bao bọc duy nhất mà tôi biết có phần nhị phân 64 bit được xây dựng sẵn để sử dụng miễn phí.
djangofan

Bạn cần trả về vận chuyển giữa mỗi Tùy chọn JVM. Chẳng hạn, nếu bạn có cùng dòng -Dopt1 = a -Dopt2 = b, nó có thể không hoạt động. Để sửa nó bạn cần viết --JvmOptions=-Dopt=a#-Dopt2=b. Tôi đã chạy lệnh từ một kịch bản ant và đấu tranh trong nhiều ngày vì điều đó. Hy vọng nó giúp.
Sydney

Bài báo bạn nói về không tồn tại lâu ... Bạn vẫn có cách để tiếp cận nó? Tôi gặp khó khăn khi bắt Apache Commons Daemon làm những gì tôi cần.
11101101b

3
@ 11101101b, apache dường như đã đính kèm can đảm của bài viết vào trang wiki của riêng mình ...
Lucas

@community wiki, tôi đã sử dụng Apache Commons Daemon cho máy windows 64 bit, nó đã thêm dịch vụ thành công. Trong khi tôi đang sử dụng các quy trình tương tự cho máy Windows 7 32 bit thì không thể thêm dịch vụ.
Shakthi

59

Với Apache Commons Daemon, giờ đây 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ể nhận được một màn hình 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 đang 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 các tệp 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.exetương ứng.
  3. Tải xuống WinRun4J và sử dụng RCEDIT.exechương trình đ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ệu để 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.


1
Tôi đã làm mọi thứ theo Cách làm của bạn, nhưng nó không thay đổi biểu tượng systray .. có ý tưởng nào không?
outofBound

Xin lỗi @outofBound, tôi đã không thấy bình luận của bạn cho đến bây giờ. Chương trình RCEDIT.exe là những gì sửa đổi biểu tượng thực thi dịch vụ của bạn. Đảm bảo rằng bạn có tệp .ico hợp lệ với mỗi kích thước được xác định đúng. Bạn có thể xem cách tạo tệp .ico thích hợp tại đây: stackoverflow.com/questions/4354617/iêu
11101101b

2
Chỉ để bạn biết, bạn không thể có khoảng trắng trong tên dịch vụ.
11101101b

1
Có @Shakthi nó hoạt động tốt trên Windows XP 32 và 64 bit, 7, 8, 8.1, Server 2003, 2008 và 2012.
11101101b

1
Vâng, @Syamsoul Azrein, nó hoạt động tuyệt vời trên 10 và bất kỳ phiên bản máy chủ nào.
11101101b

31

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


7
NSSM ROCKS! Tôi dễ dàng thực hiện trình bao bọc ngay cả từ chương trình java của tôi. Dễ dàng, nhẹ, hoạt động - 100kb của sự vội vàng! Cảm ơn bạn!
cynepnaxa

1
Bất kỳ ví dụ nào, làm thế nào để sử dụng NSSM Wrapper để khởi động ứng dụng java (Tôi đang sử dụng HelioSearch) làm dịch vụ windows trong nền khi khởi động hệ thống?
Krunal

@GiordanoMaestro mục blog của bạn không thể truy cập được nữa. Bạn có một liên kết khác?
Matthieu

2
So với Apache Commons Daemon, Wrapper.tanukisoftware.org, & yajsw, NSSM cho đến nay là lựa chọn nhanh nhất & dễ dàng nhất để biến một ứng dụng java đơn giản thành dịch vụ windows
Jeffrey Knight

Tôi đang cố gắng sử dụng NSSM để chạy jar thực thi khởi động mùa xuân của mình. Tôi đã gặp lỗi này, "Trạng thái không mong đợi SERVICE_PAUSED khi phản hồi với điều khiển START."
Kiran Kumar

26

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


3
Cảm ơn vì điều đó. Tôi đã thử YAJWS và đầu tiên, nó làm tôi sợ khi tải xuống 19mb và sau khi tôi làm theo hướng dẫn, nó hiển thị "lỗi phân tích dòng lệnh". Tôi đã xem PROCRUN và nó quá cồng kềnh để thiết lập nhanh. INSTSRV / SRVANY yêu cầu thay đổi sổ đăng ký! Launch4J gói JAR bên trong EXE, do đó, nó làm phức tạp việc triển khai. WinRun4J là một sự phù hợp hoàn hảo. Hạn chế duy nhất là nó yêu cầu một lớp đặc biệt để làm việc như một dịch vụ (thay vì chỉ gọi lớp chính tiêu chuẩn). Nhưng nhìn chung, nó hoàn hảo 99%.
fernacolo

2
FYI, phiên bản mới nhất có một trình bao bọc cho một lớp chính tiêu chuẩn.
Peter Smith

Xin chào, bạn có thể đưa ra bất kỳ ví dụ nào giải thích cách sử dụng này không? Tôi muốn sử dụng nó để khởi động phiên bản HelioSearch làm dịch vụ windows nền khi khởi động hệ thống.
Krunal

17

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:


+1 từ tôi vì đây là giải pháp nhanh nhất cho tôi "ngoài luồng" và không yêu cầu sửa đổi ứng dụng java nào là một điểm cộng rõ ràng.
Ngày xanh ngày

Tôi tìm thấy biểu đồ so sánh rất hấp dẫn này đã so sánh YAJSW với một vài trình bao bọc dịch vụ phổ biến khác. yajsw.sourceforge.net/#mozTocId284533
Green

6

Tôi nghĩ Trình bao bọc dịch vụ Java 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 tập tin cấu hình ví dụ cho việc này.


5

Nếu bạn sử dụng Gradle Build Tool, bạn có thể dùng thử plugin-dịch vụ windows của tôi , điều này hỗ trợ việc sử dụng Apache Commons Daemon Procrun .

Để tạo một ứng dụng dịch vụ java windows 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 các plugin vào build.gradletập tin 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. Run createWindowsService nhiệm vụ gradle để tạo ra một bản phân phối cửa sổ dịch vụ.

Đó 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 ${project.buildDir}/windows-servicethư mục, 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ụ chạy <project-name>-install.batvà nếu bạn muốn gỡ cài đặt dịch vụ chạy <project-name>-uninstall.bat. Để bắt đầu và dừng dịch vụ sử dụng <project-name>w.exethự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 biệt để 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.


Câu trả lời không thể chối cãi!
TaylanUB


4

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. Công cụ javapackager đi kèm với java 8 cung cấp một 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 các đố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 tài liệu sau đây, chúng tôi có thể tạo msi hoặc exe khi cần thiết.

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

4
Câu trả lời này không giải quyết câu hỏi. Không thể sử dụng javapackager để tạo trực tiếp dịch vụ windows mà chỉ tạo một tệp thực thi độc lập, ví dụ như bao gồm jre và các tài nguyên khác.
tobias_


3

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ặcUser home directory(%userProfile%)

Windows 10: Đang chạy shell:startup

trong thuộc tính của nó -> phím tắt -> mục tiêu -> 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ị

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

nếu bạn có thời gian chờ sử dụng cmd /c D:\JAVA7~1\jdk1.7.0_51\bin\java.exe -jar d:\jenkins\jenkins.warnhưng ngay cả với điều này, bạn sẽ có thời gian chờ nhưng trong nền java.exe sẽ được bắt đầu. Kiểm tra nhiệm vụ

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


3

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.


Trong khi đó, phiên bản hiện tại (được duy trì bởi Kohsuke Kawaguchi) được đặt tại đây .
FrVaBe

Có vẻ như anh ấy đã chuyển nó sang github sau phiên bản 1.9 (rất có thể là khi anh ấy đi từ Oracle sang Cloudbees).
Thorbjørn Ravn Andersen

2

Tôi đã sử dụng JavaService trước đây rất thành công. 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.


GForge đã hết hiệu lực
LWW

2

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


Bạn có thể cung cấp bản hack mẫu mà bạn đã thực hiện với "perl" ..!
peaceUser

2

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


1
Điều đó cho phép bạn bắt đầu một cái gì đó như một dịch vụ, nhưng theo hiểu biết của tôi thì nó sẽ bị tách ra, tức là bạn không thể dừng nó thông qua Dịch vụ hoặc tự động khởi động lại, v.v.
nguyên tử

1

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

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

Exe4j là một lựa chọn rất tốt mặc dù nó không miễn phí Kiểm tra nó tại exe4j Trong trình hướng dẫn để tạo tệp .exe, bạn được cung cấp tùy chọn để tạo một dịch vụ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.