it-gundan.com

Java 응용 프로그램에서 Windows 서비스를 만드는 방법

저는 방금 XP 및 Vista에서 서비스로 설치해야하는 Java 응용 프로그램을 상속했습니다. 어떤 형태로든 윈도우를 사용했기 때문에 약 8 년이 지났습니다. 자바 어플리케이션과 같이 서비스를 만들지 않아도되었습니다. (어플리케이션 용 항아리와 단일 종속 항아리가 있습니다 .- log4j ). 이 서비스를 서비스로 만드는 데 필요한 마술은 무엇입니까? 나는 소스 코드를 가지고 있으므로, 코드 수정은 바람직하게 피할 수는 있지만 가능하다.

207
ideasculptor
66
sblundy

Apache Commons Daemon 좋은 대안입니다. 윈도우 서비스에는 Procrun , 유닉스 데몬에는 Jsvc 이 있습니다. 덜 제한적인 Apache 라이센스를 사용하며 Apache Tomcat은이를 Windows 및 Linux에서 실행하기 위해 자체적으로 사용합니다! 작업을 수행하는 것은 다소 까다 롭습니다. 그러나 작업 예제에서는 철저한 기사 가 있습니다.

그 외에 서비스를 설정하는 방법을 알기 위해 Apache Tomcat 의 bin\service.bat를 볼 수도 있습니다. Tomcat에서는 Procrun 바이너리의 이름을 변경합니다 (prunsrv.exe -> Tomcat6.exe, prunmgr.exe -> Tomcat6w.exe).

Procrun을 사용하는 데 어려움을 겪었던 경우 시작 및 중지 메서드는 매개 변수 (String [] argv)를 받아 들여야합니다. 예를 들어 "start (String [] argv)"및 "stop (String [] argv)"은 작동하지만 "start ()"및 "stop ()"은 오류를 발생시킵니다. 이러한 호출을 수정할 수없는 경우 필요에 맞게 호출을 완화 할 수있는 부트 스트 래퍼 클래스를 만드는 것이 좋습니다.

94
mcdon

Apache Commons Daemon 이제 사용자 정의 실행 파일 이름과 아이콘을 가질 수 있습니다! 또한 사용자 정의 Windows 트레이 모니터를 너의 이름과 아이콘!

이제 내 서비스가 내 이름과 아이콘 (prunsrv.exe)으로 실행되고 시스템 트레이 모니터 (prunmgr.exe)에도 내 자신의 사용자 정의 이름과 아이콘이 있습니다!

  1. Apache Commons 데몬 바이너리 (prunsrv.exe 및 prunmgr.exe가 필요합니다)를 다운로드하십시오.
  2. 각각 이름을 MyServiceName.exeMyServiceNamew.exe로 변경하십시오.
  3. 다운로드 WinRun4J 그리고 아파치 실행 파일을 수정하여 다음과 같이 자신 만의 사용자 정의 아이콘을 포함하도록하는 RCEDIT.exe 프로그램을 사용하십시오 :

    > RCEDIT.exe /I MyServiceName.exe customIcon.ico
    > RCEDIT.exe /I MyServiceNamew.exe customTrayIcon.ico
    
  4. 이제 이와 같은 Windows 서비스를 설치하십시오 (자세한 내용과 옵션은 documentation 참조).

    > 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. 이제 자신의 아이콘과 이름으로 실행되는 Jar의 Windows 서비스가 있습니다! 모니터 파일을 실행할 수도 있습니다. 그러면 자신의 아이콘과 이름으로 시스템 트레이에서 실행됩니다.

53
11101101b

또 다른 옵션은 WinRun4J 입니다. 이것은 Windows 서비스 호스트 (32 비트 및 64 비트 버전)의 두 배로 구성 가능한 Java 시작 프로그램입니다. 오픈 소스이며 사용상의 제한이 없습니다.

(전체 공개 : 나는이 프로젝트에서 일한다).

25
Peter Smith

간단한 방법은 NSSM Wrapper 래퍼 ( 내 블로그 항목 참조 )입니다.

25
Giordano Maestro

또 다른 대답은 또 다른 자바 서비스 래퍼 , 이것은 Java Service Wrapper의 좋은 대안 인 것처럼 보입니다. 또한 JSW에서 YAJSW로 쉽게 이동할 수 있습니다. 확실히 나를 위해 Windows 서버에 새로 워서 Java 응용 프로그램을 서비스로 실행하려고하면 사용하기가 매우 쉽습니다.

내가 찾은 일부 다른 것들 :

  • Java Service Launcher YAJSW보다 작동하기가 더 복잡해 보였기 때문에 이것을 사용하지 않았습니다. 나는 이것이 포장지라고 생각하지 않는다.
  • JSmooth 창 서비스를 만드는 것이 주 목표는 아니지만 끝낼 수 있음 . 나는 2007 년 이후로 활동이 없었기 때문에 이것을 사용하지 않았다.
17
atomicules

나는 Java Service Wrapper 가 잘 동작한다고 생각한다. 응용 프로그램을 통합하려면 세 가지 방법 있습니다. 옵션 1이 코드를 변경하고 싶지 않다는 가정하에 가장 잘 작동 할 것 같습니다. 설정 파일은 조금 이상 할 수는 있지만, (옵션 1의 경우) 시작 프로그램과 인수 지정을위한 헬퍼 프로그램이 프로그램을 시작한다는 것을 기억하십시오. 그들은 이것을 위해 예제 설정 파일 을 가지고 있습니다.

6
Ed Thomas

JavaService 는 LGPL입니다. 그것은 매우 쉽고 안정적입니다. 추천.

4
NT_

Gradle Build Tool을 사용하면 --- windows-service-plugin 을 사용하여 Apache Commons Daemon Procrun 을 쉽게 사용할 수 있습니다.

플러그인을 사용하여 Java Windows 서비스 응용 프로그램을 만들려면 몇 가지 간단한 단계를 거쳐야합니다.

  1. 적절한 메소드를 사용하여 기본 서비스 클래스를 작성하십시오.

    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. build.gradle 파일에 플러그인을 포함하십시오.

    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"
    

    Gradle 2.1에 도입 된 새로운 인큐베이터 플러그인 메커니즘에 대한 스크립트 스 니펫 :

    plugins {
      id "com.github.alexeylisyutenko.windows-service-plugin" version "1.1.0"
    }
    
  3. 플러그인을 구성하십시오.

    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. createWindowsService gradle 작업을 실행하여 Windows 서비스 배포를 만듭니다.

그게 당신이 간단한 Windows 서비스를 만드는 데 필요한 전부입니다. 플러그인은 Apache Commons Daemon Procrun 바이너리를 자동으로 다운로드하고이 바이너리를 서비스 배포 디렉토리에 추출하고 서비스의 설치/제거를위한 배치 파일을 만듭니다.

${project.buildDir}/windows-service 디렉토리에는 서비스 실행 파일, 서비스의 설치/제거를위한 배치 스크립트 및 모든 런타임 라이브러리가 있습니다. 서비스를 설치하려면 <project-name>-install.bat를 실행하고 서비스를 제거하려면 <project-name>-uninstall.bat를 실행하십시오. 서비스를 시작하고 중지하려면 <project-name>w.exe 실행 파일을 사용하십시오.

메소드 처리 서비스 시작은 별도의 스레드를 작성하고 시작하여 처리를 수행 한 다음 리턴해야합니다. main 메서드는 서비스를 시작하고 중지 할 때 다른 스레드에서 호출됩니다.

자세한 내용은 플러그인 및 Apache Commons Daemon Procrun을 참조하십시오.

4

Glassfish v3 용으로 작성되었지만 일반적으로 Java 프로그램과 잘 작동하는 " winsw "를 사용하십시오.

.NET 런타임이 설치되어 있어야합니다.

Java 8에서는 외부 도구없이이 시나리오를 처리 할 수 ​​있습니다. javapackager Java 8과 함께 제공되는 도구는 자체 포함 된 응용 프로그램 번들을 만드는 옵션을 제공합니다.

-native 유형 자체 포함 응용 프로그램 번들을 생성합니다 (가능한 경우). -B 옵션을 사용하여 사용중인 번들에 인수를 제공하십시오. type을 지정하면이 유형의 x들만 작성됩니다. 형식을 지정하지 않으면 모두 사용됩니다.

다음 값은 유형에 유효합니다.

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

윈도우의 경우 다음을 참조하십시오. doc msi 나 exe를 필요에 따라 만들 수 있습니다.

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

Java Service Wrapper의 라이센스가 마음에 들지 않았습니다. ActiveState Perl과 함께 작업을 수행하는 서비스를 작성했습니다.

C #에서 서비스 작성에 대해 생각했지만 시간 제약이 너무 컸습니다.

2
Hugh Buchanan

나는 항상 sc.exe ( http://support.Microsoft.com/kb/251192 참조) 만 사용합니다. 그것은 SP1의 XP에 설치되어야하며, Vista의 취향에 맞지 않으면 Vista 자원 키트를 사용하여 다운로드 할 수 있습니다.

Java로는 너무 복잡하지는 않지만 정규화 된 명령 줄 인수 (x :\Java.exe ....)를 사용하거나 Ant와 함께 스크립트를 작성하여 종속 변수를 포함하고 매개 변수를 설정하면 문제가 없습니다.

2
Kevin

당신이 바로 가기를 넣어야 만하는 것처럼 간단합니다.

Windows 7 C:\users\All Users\Start Menu\Programs\Startup (관리자) 또는 User home directory(%userProfile%)

Windows 10 : 실행 중 Shell:startup

그것의 속성에 -> 바로 가기 -> 대상 -> Java.exe -jar D:\..\runJar.jar

참고 : 로그인 한 후에 만 ​​실행됩니다


관리자 권한

sc create serviceName binpath= "Java.exe -jar D:\..\runJar.jar" Windows 서비스를 만듭니다.

cmd /c D:\Java7~1\jdk1.7.0_51\bin\Java.exe -jar d:\jenkins\jenkins.war를 사용하면 타임 아웃 할 수 있지만 타임 아웃이 발생하지만 백그라운드에서 Java.exe가 시작됩니다. 작업 관리자 체크인

참고 :이 작업은 Windows 로그온 시작 (로그인하기 전에 'Startup Type'서비스 기준) 에서 실행됩니다.

Windows 서비스 생성에 대한 자세한 설명

2
Ravi Parekh

서로 다른 솔루션을 비교해 보면 다음과 같습니다. http://yajsw.sourceforge.net/#mozTocId2845

개인적으로 launch4j를 좋아합니다.

2
pushNpop

좋은 성공을하기 전에 JavaService 를 사용했습니다. 2 년 후에 업데이트되지는 않았지만 사용했을 때 꽤 견고했습니다.

2
Jason

현재 Eclipse 기반 응용 프로그램을 실행해야하지만 현재이 응용 프로그램의 로컬 변수를 설정해야합니다. sc.exe는 실행 파일 만 허용하지만 스크립트는 허용하지 않으므로 Windows 2003 리소스 키트 의 일부인 autoexnt.exe를 사용했습니다. 서비스를 단일 배치 파일로 제한하지만 하나의 배치 스크립트 만 서비스로 변환하면됩니다.

차오!

1
ramfree17

또 다른 좋은 옵션은 FireDaemon 입니다. NASA, IBM 등의 대형 상점에서 사용합니다. 전체 목록은 해당 웹 사이트를 참조하십시오.

1
Andrew Swan