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

220

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

ideasculptor
источник
Другое предложение stackoverflow.com/a/9262081/381897
bhdrkn
1
Просто для полноты: здесь serverfault.com/a/259195 говорится, что приложение должно отвечать на обратные вызовы Service Control Manager. Прочитайте этот учебник он использует Procrun ticklingmind.blogspot.com/2010/03/...
Broken_Window
Другой ответ stackoverflow.com/questions/5953525/…
Рави Парех

Ответы:

69

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

sblundy
источник
11
Java Service Wrapper выглядит очень полезным. Но я взглянул на список возможностей. Вам просто нужно знать, что версия сообщества не лицензирована для использования на сервере.
Брайан Мэтьюз
Это может быть проблемой. Это было несколько лет назад, я использовал это. Думаю, они решили зарядить.
Сблунди
Эта оболочка используется во многих проектах с открытым исходным кодом, в том числе в Jakarta Apache, таких как ActiveMQ.
Тодд
7
wrapper.tanukisoftware.org/doc/english/licenseCommunity.html Использование с закрытым исходным кодом GPL не ограничивает разработку частного программного обеспечения для внутреннего использования, которое зависит от программного обеспечения под GPL, если это программное обеспечение никогда не распространяется без полного источника все приложение доступно для всех пользователей. Хотя мы призываем корпоративных и государственных пользователей использовать Лицензионное соглашение на сервер или на разработку, Лицензионное соглашение сообщества является приемлемым, если приложение предназначено для внутреннего использования или всегда будет распространяться вместе с его полной версией.
Владимир
1
Оболочка @Vladimir tanuki больше не является открытой для 64-битной арки
gerrytan
100

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 ()» вызовут ошибки. Если вы не можете изменить эти вызовы, подумайте о создании класса начальной загрузки, который может обрабатывать эти вызовы в соответствии с вашими потребностями.

mcdon
источник
Используя рефлексию, вы, вероятно, можете обойти проблему, изложенную в вашем последнем абзаце. Кроме того, apache commons daemon - единственная из известных мне оболочек, в которой есть готовые 64-битные двоичные файлы для свободного использования.
Джангофан
Вам нужен возврат каретки между всеми опциями JVM. Например, если в одной строке указано -Dopt1 = a -Dopt2 = b, это может не сработать. Чтобы это исправить нужно написать --JvmOptions=-Dopt=a#-Dopt2=b. Я запускал команду из скрипта муравья и из-за этого несколько дней боролся. Надеюсь, поможет.
Сидней,
Статья, о которой вы говорили, давно не существует ... У вас еще есть способ добраться до нее? У меня не получается заставить Apache Commons Daemon делать то, что мне нужно.
11101101b
3
@ 11101101b, apache, кажется, прикрепил смелости статьи к своей собственной вики-странице ...
Лукас
@community wiki, я использовал Apache Commons Daemon для 64-битной Windows-машины, он успешно добавил сервис. в то время как я использую те же процессы для 32-разрядной машины Windows 7, он не может добавить службу.
Шакти
59

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

11101101b
источник
1
Я сделал все в соответствии с вашим, как, но это не меняет значок systray .. Есть идеи, почему?
вне пределов
Извините @outofBounds, я не видел ваш комментарий до сих пор. Программа RCEDIT.exe - это то, что изменяет значок вашего исполняемого файла службы. Убедитесь, что у вас есть действительный файл .ico с каждым размером, правильно определенным. Вы можете увидеть, как создать правильный файл
.ico
2
Просто чтобы вы знали, у вас не может быть пробелов в имени сервиса.
11101101b
1
Да @ Шакти, он отлично работает на 32- и 64-разрядных версиях Windows XP, 7, 8, 8.1, Server 2003, 2008 и 2012.
11101101b
1
Да, @Syamsoul Azrein, он отлично работает на 10 и любой серверной версии.
11101101b
31

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

Giordano Maestro
источник
7
NSSM ROCKS! Я легко делаю обертку даже из моей Java-программы. Легко, легко, работает - 100кб счастья! Спасибо!
cynepnaxa
1
Любой пример, как использовать NSSM Wrapper для запуска экземпляра приложения Java (я использую HelioSearch) в качестве службы Windows в фоновом режиме при запуске системы?
Крунал
@ GiordanoMaestro ваша запись в блоге больше не доступна. У вас есть другая ссылка?
Матье
2
По сравнению с Apache Commons Daemon, wrapper.tanukisoftware.org и Yajsw, NSSM был, безусловно, самым быстрым и простым способом превращения простого Java-приложения в службу Windows
Джеффри Найт,
Я пытаюсь использовать NSSM для запуска исполняемого файла jar для весенней загрузки. Я получил эту ошибку «Неожиданный статус SERVICE_PAUSED в ответ на управление START».
Киран Кумар
26

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

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

Питер Смит
источник
3
Спасибо за это. Я попробовал YAJWS, и сначала он напугал меня загрузкой 19 Мб, а после того, как я следовал инструкциям, он показал «ошибка синтаксического анализа командной строки». Я посмотрел на PROCRUN, и он слишком громоздок для быстрой настройки. INSTSRV / SRVANY требует изменений в реестре! Launch4J упаковывает JAR в EXE-файл, что усложняет развертывание. WinRun4J идеально подходил. Единственным недостатком является то, что для работы в качестве службы требуется специальный класс (вместо простого вызова стандартного основного класса). Но в целом это на 99% идеально.
Фернаколо
2
К вашему сведению, последняя версия имеет оболочку для стандартного основного класса.
Питер Смит
Привет, Можете ли вы привести какой-либо пример, который объясняет, как использовать это? Я хотел бы использовать его для запуска экземпляра HelioSearch в качестве фоновой службы Windows при запуске системы.
Крунал
17

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

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

  • Java Service Launcher Я не использовал это, потому что работать было сложнее, чем YAJSW. Я не думаю, что это обертка.
  • Услуги JSmooth Create Window не являются его основной целью, но могут быть выполнены . Я не использовал это, потому что не было никакой активности с 2007 года.
atomicules
источник
+1 от меня, так как это было самое быстрое решение для меня "из коробки", и никаких изменений в java-приложении не требовалось, что является несомненным плюсом.
Зеленый день
Я нашел эту очень убедительную сравнительную таблицу, в которой сравнивался YAJSW с несколькими другими распространенными сервисными оболочками. yajsw.sourceforge.net/#mozTocId284533
Зеленый
6

Я думаю, что Java Service Wrapper работает хорошо. Обратите внимание, что есть три способа интеграции вашего приложения. Похоже, вариант 1 будет работать лучше для вас, учитывая, что вы не хотите менять код. Файл конфигурации может немного сойти с ума, но просто помните, что (для варианта 1) программа, которую вы запускаете и для которой вы будете задавать аргументы, является их вспомогательной программой, которая затем запустит вашу программу. У них есть пример файла конфигурации для этого.

Эд Томас
источник
5

Если вы используете Gradle Build Tool, вы можете попробовать мой плагин windows-service , который облегчает использование 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. Запустите задачу gradle createWindowsService, чтобы создать дистрибутив службы 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.

Алексей Лисютенко
источник
Недооцененный ответ!
TaylanUB
4

JavaService - это LGPL. Это очень легко и стабильно. Настоятельно рекомендуется.

NT_
источник
4

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

В случае окон см. Следующий документ, мы можем создать MSI или EXE по мере необходимости.

exe: Generates a Windows .exe package.
msi: Generates a Windows Installer package.
Steephen
источник
4
Этот ответ не касается вопроса. Javapackager не может быть использован для непосредственного создания службы Windows, а скорее для создания автономного исполняемого файла, который, например, включает в себя JRE и другие ресурсы.
tobias_
3

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

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

Рави Парех
источник
3

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

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

Thorbjørn Ravn Andersen
источник
Между тем, текущая версия (поддерживаемая известным Kohsuke Kawaguchi) находится здесь .
FrVaBe
Похоже, он переместил его в github после версии 1.9 (скорее всего, когда он перешел из Oracle в Cloudbees).
Турбьёрн Равн Андерсен
2

Я использовал JavaService раньше с хорошим успехом. Он не обновлялся в течение нескольких лет, но когда я использовал его, он был довольно твердым.


источник
GForge было прекращено
LWW
2

Мне не понравилось лицензирование для Java Service Wrapper. Я пошел с ActiveState Perl, чтобы написать сервис, который делает эту работу.

Я думал о написании сервиса на C #, но мои временные ограничения были слишком жесткими.

Хью Бьюкенен
источник
Можете ли вы предоставить пример взлома, который вы сделали с "perl" ..!
PeaceUser
2

Я всегда просто использовать sc.exe (см http://support.microsoft.com/kb/251192 ). Он должен быть установлен на XP с пакетом обновления 1 (SP1), и, если он не в вашем вкусе Vista, вы можете загрузить его с помощью комплекта ресурсов Vista.

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

Kevin
источник
1
Это позволяет вам запускать что-то как сервис, но, насколько я понимаю, оно будет отключено, то есть вы не сможете остановить это через Сервисы или перезапустить автоматически, и т. Д. Я могу быть совершенно неправ, хотя - только начал изучать это.
атомные заряды
1

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

Эндрю Свон
источник
1

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

Чао!


источник
-1

Exe4j - очень хороший вариант, хотя и не бесплатный. Проверьте это в Exe4j. В мастере для создания файла .exe вы можете создать службу.

ОЗУ
источник