it-swarm-ru.tech

Как создать службу Windows из приложения Java

Я только что унаследовал приложение Java, которое необходимо установить как службу в XP и ​​Vista. Прошло около 8 лет с тех пор, как я использовал окна в любой форме, и мне никогда не приходилось создавать службу, не говоря уже о чем-то вроде приложения Java (у меня есть jar для приложения и одна зависимость jar - log4j). Какая магия необходима для запуска этой службы? У меня есть исходный код, поэтому возможны модификации кода, хотя и желательно их избегать.

207
ideasculptor

Мне повезло с Java Service Wrapper

66
sblundy

Apache Commons Daemon хорошая альтернатива. Он имеет Procrun для служб Windows и Jsvc для демонов Unix. Он использует менее строгую лицензию Apache, и Apache Tomcat использует ее как часть себя для работы в Windows и Linux! Работать немного сложно, но есть исчерпывающая статья с рабочим примером.

Кроме того, вы можете заглянуть в bin\service.bat в Apache Tomcat , чтобы получить представление о том, как настроить сервис. В Tomcat они переименовывают двоичные файлы Procrun (prunsrv.exe -> Tomcat6.exe, prunmgr.exe -> Tomcat6w.exe).

Что-то, с чем я боролся при использовании Procrun, ваши методы start и stop должны принимать параметры (String [] argv). Например, "start (String [] argv)" и "stop (String [] argv)" будут работать, но "start ()" и "stop ()" вызовут ошибки. Если вы не можете изменить эти вызовы, подумайте о создании класса начальной загрузки, который может выполнять массаж этих вызовов в соответствии с вашими потребностями.

94
mcdon

С помощью Apache Commons Daemon теперь вы можете иметь собственное имя исполняемого файла и значок! Вы также можете получить собственный монитор Windows в трее с Ваше собственное имя и значок!

Теперь моя служба работает с моим собственным именем и значком (prunsrv.exe), а у монитора в системном трее (prunmgr.exe) также есть мое собственное имя и значок!

  1. Загрузите двоичные файлы Apache Commons Daemon (вам понадобятся prunsrv.exe и prunmgr.exe).
  2. Переименуйте их в MyServiceName.exe и MyServiceNamew.exe соответственно.
  3. Загрузите WinRun4J и используйте прилагаемую программу RCEDIT.exe, чтобы изменить исполняемый файл Apache, добавив свой собственный значок, например:

    > 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. Теперь у вас есть служба Windows вашего Jar, которая будет работать с вашим собственным значком и именем! Вы также можете запустить файл монитора, и он будет работать в системном трее с вашим собственным значком и именем.

53
11101101b

Еще одна опция --- WinRun4J . Это настраиваемая панель запуска Java, которая используется в качестве хоста службы Windows (32- и 64-разрядные версии). Это открытый исходный код и нет никаких ограничений на его использование.

(полное раскрытие: я работаю над этим проектом).

25
Peter Smith

Простой способ - это NSSM Wrapper Wrapper ( см. Мою запись в блоге ).

25
Giordano Maestro

Еще один ответ: еще один Java Service Wrapper , это похоже на хорошую альтернативу Java Service Wrapper, поскольку имеет лучшее лицензирование. Он также предназначен для того, чтобы было легко перейти с JSW на YAJSW. Конечно, для меня, новичка в Windows-серверах и попытки запустить приложение Java в качестве службы, его было очень легко использовать.

Некоторые другие я нашел, но в итоге не использовал:

  • Java Service Launcher Я не использовал это, потому что работать было сложнее, чем YAJSW. Я не думаю, что это обертка.
  • JSmooth Создание служб Windows не является его основной целью, но может быть сделано . Я не использовал это, потому что не было никакой активности с 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.

Обратите внимание, что метод обработки службы start должен создать и запустить отдельный поток для выполнения обработки, а затем вернуться. Основной метод вызывается из разных потоков при запуске и остановке службы.

Для получения дополнительной информации, пожалуйста, прочитайте о плагине и Apache Commons Daemon Procrun.

4
Alexey Lisyutenko

Используйте " winsw ", который был написан для Glassfish v3, но в целом хорошо работает с программами Java.

Требуется установленная среда .NET.

3
Thorbjørn Ravn Andersen

С Java 8 мы можем справиться с этим сценарием без каких-либо внешних инструментов. javapackager инструмент, поставляемый с Java 8 предоставляет возможность создавать автономные пакеты приложений:

-native type Создание автономных пакетов приложений (если это возможно). Используйте параметр -B для предоставления аргументов используемым упаковщикам. Если указан тип, то создается только пакет этого типа. Если тип не указан, используется все.

Следующие значения действительны для типа:

-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 ). Он должен быть установлен в XP из пакета обновления 1 (SP1), и, если он не в вашем вкусе Vista, вы можете загрузить его с помощью комплекта ресурсов Vista.

Я не сделал ничего слишком сложного с Java, но мне вполне подходит либо использование полностью определенного аргумента командной строки (x:\Java.exe ....), либо создание сценария с Ant для включения зависимостей и установки параметров.

2
Kevin

это просто, как вы должны поставить ярлык в

Windows 7 C:\users\All Users\Start Menu\Programs\Startup (Admin) или 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
Jason

В настоящее время мне требуется, чтобы это запускало приложение на основе Eclipse, но мне нужно сначала установить некоторые переменные, которые являются локальными для этого приложения. sc.exe разрешает только исполняемые файлы, но не скрипты, поэтому я обратился к autoexnt.exe, который является частью набор ресурсов Windows 20 . Он ограничивает службу одним пакетным файлом, но мне нужен только один пакетный сценарий для преобразования в службу.

чао!

1
ramfree17

Еще один хороший вариант FireDaemon . Он используется в некоторых крупных магазинах, таких как NASA, IBM и т. Д .; см. их веб-сайт для полного списка.

1
Andrew Swan