2009-10-24 57 views
42

Tôi có tệp JAR thực thi. Có thể tạo một dịch vụ Windows của JAR đó không? Trên thực tế, tôi chỉ muốn chạy điều đó khi khởi động, nhưng tôi không muốn đặt tệp JAR đó trong thư mục khởi động của tôi, không phải trong sổ đăng ký.Cách tạo dịch vụ windows từ java jar?

+1

Không có trong sổ đăng ký?Vậy tại sao bạn muốn nó như một Dịch vụ? –

+0

@ o.k.w là đúng nếu bạn đang tạo cửa sổ dịch vụ, Nó sẽ tạo mục nhập trong sổ đăng ký. –

+0

Tôi nghĩ người dùng này có nghĩa là "chạy dưới dạng dịch vụ, không phải từ khóa đăng ký khởi động dưới dạng dịch vụ không" –

Trả lời

6

Tanuki thay đổi giấy phép của JSW một số thời gian trước đây, nếu tôi là để bắt đầu một dự án, tôi sẽ sử dụng Yet Another Java Service Wrapper, http://yajsw.sourceforge.net/ mà là nhiều hơn hoặc ít hơn một triển khai mã nguồn mở bắt chước JWS, và sau đó xây dựng trên nó và cải thiện nó hơn nữa.

CHỈNH SỬA: Tôi đã sử dụng YAJSW trong vài năm trên một số platorms (Windows, một số linux ...) và nó là rất tốt, phát triển đang diễn ra.

9

Tôi đã thử nghiệm với Apache Commons Daemon. Nó hỗ trợ các cửa sổ (Procrun) và unix (Jsvc). Trình cài đặt nâng cao có Java Service tutorial với dự án ví dụ để tải xuống. Nếu bạn nhận được javaservice.jar của họ hoạt động như một dịch vụ windows, bạn có thể kiểm tra nó bằng cách sử dụng "telnet 4444". Tôi đã sử dụng ví dụ của họ vì tôi tập trung vào việc chạy một dịch vụ java windows, chứ không phải viết java.

+0

Đối với dịch vụ Windows [WinRun4j] (http://winrun4j.sourceforge.net/) cũng là một ứng cử viên tốt, nó có thể tăng gấp đôi như một Trình khởi chạy Java hoặc Trình bao bọc dịch vụ – mcdon

2

Với procrun bạn cần phải sao chép prunsrv vào thư mục ứng dụng (download), và tạo ra một install.bat như thế này:

set PR_PATH=%CD% 
SET PR_SERVICE_NAME=MyService 
SET PR_JAR=MyService.jar 
SET START_CLASS=org.my.Main 
SET START_METHOD=main 
SET STOP_CLASS=java.lang.System 
SET STOP_METHOD=exit 
rem ; separated values 
SET STOP_PARAMS=0 
rem ; separated values 
SET JVM_OPTIONS=-Dapp.home=%PR_PATH% 
prunsrv.exe //IS//%PR_SERVICE_NAME% --Install="%PR_PATH%\prunsrv.exe" --Jvm=auto --Startup=auto --StartMode=jvm --StartClass=%START_CLASS% --StartMethod=%START_METHOD% --StopMode=jvm --StopClass=%STOP_CLASS% --StopMethod=%STOP_METHOD% ++StopParams=%STOP_PARAMS% --Classpath="%PR_PATH%\%PR_JAR%" --DisplayName="%PR_SERVICE_NAME%" ++JvmOptions=%JVM_OPTIONS% 

Tôi đoán để

  • chạy này từ cùng một thư mục nơi jar và prunsrv.exe là
  • bình có MANIFEST.MF
  • và bạn đã tắt móc đăng ký vào JVM (cho ví dụ với context.registerShutdownHook() trong Spring) ...
  • không sử dụng đường dẫn tương đối cho các tệp bên ngoài bình (ví dụ log4j nên được sử dụng với log4j.appender.X.File = $ {app.home}/logs /my.log hoặc một cái gì đó tương tự)

Kiểm tra procrun manualthis tutorial để biết thêm thông tin.

+0

có bất kỳ ví dụ nào mà bạn có thể chia sẻ không? –

+0

có: xem phần bên trên :-) bạn cần gì khác? – BTakacs

+0

Cảm ơn BTakacs, tôi đã kiểm tra hướng dẫn của bạn và nó hoạt động tốt. Nhưng tiếc là điều đó không giải quyết được những gì tôi muốn làm .. Tôi đang cố gắng đạt được điều đó ngay từ C#. –

36

Giải pháp đơn giản nhất tôi tìm thấy cho điều này cho đến nay là Cách sử dụng Non-Sucking Service Manager

sẽ

nssm install <servicename> "C:\Program Files\Java\jre7\java.exe" "-jar <path-to-jar-file>" 
+7

Tôi đã làm như vậy và cài đặt thành công nhưng ngay sau khi tôi chạy nó, nó cho biết 'trạng thái không mong muốn SERVICE-PAUSED in đáp ứng với điều khiển START ' – aneela

+0

@ kopernik, Điều tương tự cũng xảy ra với tôi ... xin vui lòng giúp đỡ .. – Shakthi

+0

Vấn đề tương tự như bạn đã đề cập. Bất cứ ý tưởng gì là sai? –

9

Sử dụng nssm.exe nhưng hãy nhớ để thiết lập AppDirectory hoặc bất kỳ thư viện hoặc nguồn lực cần thiết sẽ không thể truy cập . Theo mặc định, nssm đặt thư mục làm việc hiện tại vào thư mục của ứng dụng, java.exe, không phải là jar. Vì vậy, hãy thực hiện việc này để tạo tập lệnh theo lô:

pushd <path-to-jar> 
    nssm.exe install "<service-name>" "<path-to-java.exe>" "-jar <name-of-jar>" 
    nssm.exe set "<service-name>" AppDirectory "<path-to-jar>" 

Điều này sẽ khắc phục sự cố tạm dừng dịch vụ.

+1

Điều này tốt ... Bạn nên thêm nó làm bình luận cho câu trả lời của kopernik. –

+0

Đặt AppDirectory sau khi tạo dịch vụ không thành công trong trường hợp của tôi. Nhưng bạn có thể khởi chạy một gui với 'nssm install ' và đặt AppDirectory cũng như các tham số hữu ích khác như các tệp nhật ký ở đó và tạo dịch vụ trong một lần – JCvanDamme

Các vấn đề liên quan