programing

Java 앱에서 Windows 서비스를 만드는 방법

bestcode 2022. 7. 16. 15:10
반응형

Java 앱에서 Windows 서비스를 만드는 방법

XP 및 vista에 서비스로 설치해야 하는 Java 애플리케이션을 방금 상속받았습니다.어떤 형태로든 윈도우를 사용한 지 약 8년이 지났고, 자바 앱(앱용 jar와 하나의 의존성 jar-log4j)은 말할 것도 없고, 서비스도 만들어 본 적이 없습니다.이 서비스를 이용하기 위해 필요한 마법은 무엇입니까?소스를 입수했기 때문에 코드 수정이 가능하지만 가급적 피해야 합니다.

Apache Commons Daemon이 좋은 대안입니다.Windows 서비스에는 Procrun, Unix Daemon에는 Jsvc가 있습니다.Apache는 제한이 적은 Apache 라이센스를 사용하며 Apache Tomcat은 Windows 및 Linux에서 실행하기 위한 일부로 사용합니다.그것을 작동시키는 것은 조금 까다롭지만, 작업 예시와 함께 포괄적인 기사가 있습니다.

그 밖에도 bin\service를 참조할 수 있습니다.Apache Tomcat을 사용하여 서비스 설정 방법을 확인하십시오.Tomcat에서는 Procrun 바이너리의 이름을 변경합니다(prunsrv.exe -> Tomcat6.exe, prunmgr.exe -> Tomcat6w.exe).

Procrun을 사용하는 데 어려움을 겪었습니다.시작 메서드와 정지 메서드는 파라미터(String[] argv)를 수용해야 합니다.예를 들어 "start(String[] argv)"와 "stop(String[] argv)"는 동작하지만 "start()"와 "stop()"은 오류를 발생시킵니다.이러한 콜을 변경할 수 없는 경우 필요에 따라 콜을 마사지할 수 있는 부트스트래퍼 클래스를 만드는 것을 검토해 주십시오.

Java Service Wrapper는 이 좋았습니다.

Apache Commons Daemon을 사용하면 사용자 지정 실행 파일 이름과 아이콘을 사용할 수 있습니다.사용자 이름과 아이콘을 사용하여 Windows 트레이 모니터를 커스텀 할 수도 있습니다.

이제 내 이름과 아이콘(prunsrv.exe)을 사용하여 서비스를 실행하고 시스템 트레이 모니터(prunmgr.exe)에도 커스텀 이름과 아이콘이 있습니다.

  1. Apache Commons Daemon 바이너리를 다운로드합니다(prunsrv.exe 및 prunmgr.exe가 필요합니다).

  2. 을 '하다'로 바꾸세요.MyServiceName.exe ★★★★★★★★★★★★★★★★★」MyServiceNamew.exe각각 다음과 같다.

  3. WinRun4J를 다운로드하여RCEDIT.exeApache 실행 파일을 수정하여 다음과 같은 사용자 지정 아이콘을 포함하도록 함께 제공되는 프로그램:

    > RCEDIT.exe /I MyServiceName.exe customIcon.ico
    > RCEDIT.exe /I MyServiceNamew.exe customTrayIcon.ico
    
  4. Windows 서비스를 다음과 같이 인스톨 합니다(자세한 내용과 옵션에 대해서는,

    > 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 서비스가 사용자 고유의 아이콘과 이름으로 실행되게 되었습니다!모니터 파일을 기동할 수도 있습니다.이 파일은 시스템 트레이에서 독자적인 아이콘과 이름으로 실행됩니다.

    > MyServiceNamew.exe //MS//MyServiceName
    

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

또 하나의 옵션은 WinRun4J입니다.이것은 Windows 서비스 호스트(32비트 버전과 64비트 버전 모두)로서 기능하는 설정 가능한 Java 런처입니다.이것은 오픈 소스이며 사용에 대한 제한은 없습니다.

(완전 공개:저는 이 프로젝트에 종사하고 있습니다).

또 다른 답은 Yet Another Java Service Wrapper입니다.이것은 Java Service Wrapper에 대한 좋은 대안으로, 보다 나은 라이선스를 가지고 있습니다.JSW에서 YAJSW로 쉽게 이동할 수 있도록 고안되었습니다. 물론 Windows Server를 처음 접하는 저로서는 Java 앱을 서비스로 실행하려고 하는 저로서는 매우 사용하기 쉬웠습니다.

발견되었지만 사용하지 않은 다른 항목:

  • Java Service Launcher YAJSW보다 작업이 복잡해 보여서 사용하지 않았습니다만, 포장지는 아닌 것 같습니다.
  • JSmooth Creating Window의 서비스는 주요 목표는 아니지만 실행할 수 있습니다.2007년 이후 활동이 없었기 때문에 사용하지 않았습니다.

Gradle Build Tool을 사용하면 Apache Commons 데몬 Procrun을 쉽게 사용할 수 있는 Windows-service-plugin을 사용할 수 있습니다.

플러그인을 사용하여 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. 인을 러러 your your 에 포함시키다build.gradlefilename을 클릭합니다.

    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 서비스 배포를 만듭니다.

이것으로 간단한 윈도 서비스를 만들 수 있습니다.플러그인은 Apache Commons Daemon Procrun 바이너리를 자동으로 다운로드하고 이 바이너리를 서비스 배포 디렉토리에 추출하여 서비스 설치/제거를 위한 배치 파일을 만듭니다.

»${project.buildDir}/windows-service디렉토리에는 서비스 실행 파일, 서비스 설치/설정을 위한 배치 스크립트 및 모든 런타임 라이브러리가 있습니다.하려면 을 실행합니다.<project-name>-install.bat 하는 는, 「」를 실행합니다.<project-name>-uninstall.bat를 및 하려면 을 사용합니다<project-name>w.exe실행 가능.

메서드 처리 서비스 시작에서는 처리를 수행하기 위해 별도의 스레드를 생성하고 시작한 후 반환해야 합니다.서비스를 시작하거나 중지할 때 다른 스레드에서 기본 메서드가 호출됩니다.

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

Java Service Wrapper는 잘 작동하는 것 같아요.애플리케이션을 통합하는 방법에는 세 가지가 있습니다.코드 변경을 원하지 않는 경우 옵션1이 가장 적합할 것 같습니다.컨피규레이션파일은 조금 혼란스러울 수 있습니다만, 기동하고 있는 프로그램(옵션 1)과 인수를 지정하는 프로그램은, 프로그램을 기동하는 도우미 프로그램입니다.여기에는 설정 파일의 예가 있습니다.

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

요구하다.NET 런타임 설치.

Java Service는 LGPL입니다.그것은 매우 쉽고 안정적이다.강력히 추천합니다.

다양한 솔루션의 비교는 http://yajsw.sourceforge.net/ #mozTocId284533 에서 확인할 수 있습니다.

개인적으로는 launch4j

Java 8에서는 외부 툴 없이 이 시나리오를 처리할 수 있습니다.Java 8과 함께 제공되는 javapackager 툴은 자체 억제형 애플리케이션 번들을 생성할 수 있는 옵션을 제공합니다.

native type 자기포함형 어플리케이션번들을 생성합니다(가능한 경우).사용하는 번들러에 인수를 지정하려면 -B 옵션을 사용합니다.type을 지정하면 이 유형의 번들만 생성됩니다.유형을 지정하지 않으면 모두 사용됩니다.

유형에는 다음 값이 유효합니다.

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

Windows 의 경우는, 다음의 메뉴얼을 참조해 주세요.필요에 따라 msi 또는 exe 를 작성할 수 있습니다.

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

Java Service를 사용해 본 적이 있습니다.몇 년 동안 업데이트되지 않았지만, 사용했을 때는 꽤 견고했습니다.

Java Service Wrapper 라이선스가 마음에 들지 않았습니다.ActiveState Perl을 사용하여 작업을 수행하는 서비스를 작성했습니다.

C#에서 서비스를 쓸까 생각했지만, 시간 제약이 너무 심했습니다.

항상 sc.exe만 사용합니다(http://support.microsoft.com/kb/251192) 참조).SP1에서 XP에 설치해야 합니다.Vista에 해당되지 않는 경우 Vista 리소스 키트와 함께 다운로드할 수 있습니다.

Java에서는 그다지 복잡한 작업을 하지 않았습니다만, 정규화된 명령줄 인수(x:\java.exe ......)를 사용하거나 Ant에서 스크립트를 작성하여 디펜시스를 포함하거나 파라미터를 설정하는 것이 좋습니다.

숏컷을 넣어야 하기 때문에 간단합니다.

윈도 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 서비스 생성에 대한 자세한 설명

또 다른 좋은 옵션은 Fire Daemon입니다.NASA, IBM 등과 같은 일부 대형 상점에서 사용하고 있습니다. 자세한 목록은 해당 상점의 웹 사이트를 참조하십시오.

현재 이클립스 기반 응용 프로그램을 실행하기 위해 이것이 필요한데 먼저 해당 응용 프로그램의 로컬 변수를 설정해야 합니다.sc.exe는 실행 파일만 허용하고 스크립트는 허용하지 않기 때문에 autoexnt로 전환했습니다.윈도우즈 2003 리소스 키트의 일부인 exe.서비스를 1개의 배치 파일로 제한하지만 서비스로 변환하는 배치 스크립트는 1개뿐입니다.

차오!

저는 지난 몇 년간 jar2exe를 사용하여 Windows에서 Java 애플리케이션을 서비스로 실행하고 있습니다.Windows 서비스로 설치할 수 있는 exe 파일을 생성하는 옵션을 제공합니다.

언급URL : https://stackoverflow.com/questions/68113/how-to-create-a-windows-service-from-java-app

반응형