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

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

Другое предложение stackoverflow.com/a/9262081/381897

bhdrkn 13.05.2014 14:37

Просто для полноты: здесь serverfault.com/a/259195 говорит, что приложение должно отвечать на обратные вызовы Service Control Manager. Прочтите это руководство, в нем используется Procrun ticklingmind.blogspot.com/2010/03/…

Broken_Window 18.08.2015 18:08

Другой ответ stackoverflow.com/questions/5953525/…

Ravi Parekh 13.02.2017 15:39
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
225
3
302 684
19
Перейти к ответу Данный вопрос помечен как решенный

Ответы 19

Ответ принят как подходящий

Мне повезло с оболочка службы Java

Java Service Wrapper выглядит очень полезным. Но я посмотрел на список функций. Вам просто нужно знать, что версия сообщества не лицензирована для использования на сервере.

Brian Matthews 16.09.2008 05:36

Это могло быть проблемой. Это было несколько лет назад. Думаю, они решили зарядить.

sblundy 16.09.2008 06:06

Эта оболочка используется множеством проектов с открытым исходным кодом, в том числе некоторыми на Jakarta Apache, такими как ActiveMQ.

Todd 16.09.2008 06:36

Что мне нравится в оболочке, так это то, что ее можно настроить для перезапуска JVM, если она заблокируется.

Andrew Swan 16.09.2008 16:46
wrapper.tanukisoftware.org/doc/english/licenseCommunity.html Closed Source Use The GPL does not restrict private software from being developed for internal use which depends on software under the GPL as long as that software is never distributed without making the full source of the entire application available to all users. While we encourage corporate and government users to make use of either a Server or Development License Agreement, the Community License Agreement is acceptable as long as the application is for internal use or will be always be distributed along with its full src.
Vladimir 30.12.2009 19:56

Обертка @Vladimir Tanuki больше не является открытой для 64-битной арки.

gerrytan 04.07.2014 03:31

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

GForge больше не выпускается

lww 07.06.2020 16:05

Рабочие ссылки: multiplan.co.uk/software/javaservice (документация) download.forge.ow2.org/javaservice (исходный код и двоичные файлы) Я унаследовал проект, использующий JavaService. Он отвечает нашим потребностям, даже если он уже немного устарел.

Gary Sheppard 09.12.2020 15:46

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

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

Не могли бы вы предоставить образец хака, который вы сделали с "perl" ..!

peaceUser 15.10.2016 12:32

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

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

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

atomicules 02.09.2010 14:42

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

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

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

Чао!

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

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

Спасибо за это. Я пробовал YAJWS, и сначала он напугал меня загрузкой 19 МБ, а после того, как я выполнил инструкции, он показал «ошибку синтаксического анализа командной строки». Я посмотрел на PROCRUN, и он слишком громоздкий для быстрой настройки. INSTSRV / SRVANY требует изменений в реестре! Launch4J упаковывает JAR в EXE, что усложняет развертывание. WinRun4J идеально подошел. Единственный недостаток заключается в том, что для работы в качестве службы требуется специальный класс (вместо простого вызова стандартного основного класса). Но в целом он идеален на 99%.

fernacolo 16.05.2011 04:07

К вашему сведению, последняя версия имеет оболочку для стандартного основного класса.

Peter Smith 19.09.2011 18:59

Привет, Вы можете привести какой-нибудь пример, объясняющий, как это использовать? Я хотел бы использовать его для запуска экземпляра HelioSearch в качестве фоновой службы Windows при запуске системы.

Krunal 08.01.2015 15:19

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

Демон Apache Commons - хорошая альтернатива. Он имеет 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, ваши методы запуска и остановки должны принимать параметры (String [] argv). Например, «start (String [] argv)» и «stop (String [] argv)» будут работать, но «start ()» и «stop ()» вызовут ошибки. Если вы не можете изменить эти вызовы, подумайте о создании класса загрузчика, который может обрабатывать эти вызовы в соответствии с вашими потребностями.

Используя отражение, вы, вероятно, могли бы обойти проблему, о которой говорили в последнем абзаце. Кроме того, демон apache commons - единственная известная мне оболочка, которая имеет предварительно созданные 64-битные двоичные файлы для бесплатного использования.

djangofan 09.11.2011 03:41

Вам нужен возврат каретки между каждым параметром JVM. Например, если у вас в той же строке -Dopt1 = a -Dopt2 = b, это может не сработать. Чтобы исправить это нужно написать --JvmOptions=-Dopt=a#-Dopt2=b. Я запускал команду из сценария муравья и боролся из-за этого несколько дней. Надеюсь, это поможет.

Sydney 14.03.2012 19:25

Статья, о которой вы говорили, давно не существует ... У вас еще есть способ добраться до нее? Мне не удается заставить Apache Commons Daemon делать то, что мне нужно.

11101101b 24.05.2012 18:26

@ 11101101b, похоже, что apache вложил всю статью в свой собственная вики-страница ...

Lucas 28.06.2012 17:29

@community wiki, я использовал Демон Apache Commons для 64-битной машины Windows, он успешно добавил службу. пока я использую те же процессы для 32-разрядной машины с Windows 7, он не может добавить службу.

Shakthi 29.12.2014 11:40

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

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

  • Средство запуска служб Java Я не использовал это, потому что это выглядело более сложным для работы, чем YAJSW. Не думаю, что это обертка.
  • JSmooth Его основная цель - не создание служб Windows, а можно сделать. Я не использовал это, потому что с 2007 года не было никакой активности.

+1 от меня, так как это было самое быстрое решение для меня «из коробки», и никаких изменений в java-приложении не потребовалось, что является несомненным плюсом.

Green Day 08.11.2013 02:48

Я нашел эту очень убедительную сравнительную таблицу, в которой YAJSW сравнивается с несколькими другими распространенными оболочками служб. yajsw.sourceforge.net/#mozTocId284533

Green 17.06.2014 22:15

Довольно хорошее сравнение различных решений доступно по адресу: http://yajsw.sourceforge.net/#mozTocId284533

Лично нравится launch4j

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

Требовать наличия установленной среды выполнения .NET.

Между тем текущая версия (поддерживаемая известным Kohsuke Kawaguchi) расположена здесь.

FrVaBe 18.04.2013 10:32

Похоже, он переместил его на github после версии 1.9 (скорее всего, когда он перешел с Oracle на Cloudbees).

Thorbjørn Ravn Andersen 18.04.2013 16:12

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

    > MyServiceNamew.exe //MS//MyServiceName
    

Я все сделал по вашему Как сделать, но это не меняет значок в панели задач .. есть идеи почему?

outofBounds 12.06.2012 17:12

Извините, @outofBounds, я не видел вашего комментария до сих пор. Программа RCEDIT.exe - это то, что изменяет значок исполняемого файла службы. Убедитесь, что у вас есть действующий ICO-файл с правильно определенными размерами. Вы можете увидеть, как создать правильный .ico файл здесь: stackoverflow.com/questions/4354617/…

11101101b 03.12.2012 19:28

Просто чтобы вы знали, у вас не может быть пробелов в имени службы.

11101101b 02.10.2013 20:31

@ 11101101b, это будет работать на 32-битной машине с Windows 7?

Shakthi 29.12.2014 11:45

Да, @Shakthi, он отлично работает на 32 и 64-битных Windows XP, 7, 8, 8.1, Server 2003, 2008 и 2012.

11101101b 30.12.2014 23:20

Это может быть не окончательный ответ, но выполните следующие команды c: \ Temp> prunsrv.exe // IS // VIJAY создать службу с именем VIJAY c: \ temp \ prunmgr.exe // ES // VIJAY запустить пользовательский интерфейс для редактирования службы VIJAY Its легко редактировать параметры из пользовательского интерфейса

Vijay 16.12.2015 11:52

Да, @Syamsoul Azrein, он отлично работает на 10 и любой серверной версии.

11101101b 21.01.2019 03:50

Спасибо, что указали мне правильное направление. Также см. joerglenhard.wordpress.com/2012/05/29/… для более полного примера.

pm_ 07.05.2020 17:57

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

NSSM ROCKS! Я легко делаю обертку даже из своей java-программы. Легко, легко, работает - счастья 100кб! Спасибо!

cynepnaxa 20.03.2014 14:11

Любой пример, как использовать NSSM Wrapper для запуска экземпляра Java-приложения (я использую HelioSearch) в качестве службы Windows в фоновом режиме при запуске системы?

Krunal 08.01.2015 15:21

@GiordanoMaestro, ваша запись в блоге больше не доступна. У вас есть еще одна ссылка?

Matthieu 09.03.2015 22:39

По сравнению с Apache Commons Daemon, wrapper.tanukisoftware.org и yajsw NSSM был, безусловно, самым быстрым и простым вариантом для превращения простого Java-приложения в службу Windows.

Jeffrey Knight 20.03.2016 02:06

Я пытаюсь использовать NSSM для запуска исполняемого файла jar для весенней загрузки. Я получил эту ошибку: «Неожиданный статус SERVICE_PAUSED в ответ на элемент управления START».

Kiran Kumar 04.09.2016 18:47

Разработчик @java видит этот ответ от "gcerkez" stackoverflow.com/questions/1617458/…

J.Z. 13.01.2017 17:00

У меня был файл .cmd с java -jar myapp.jar, который запускает мое приложение Java. Установил как услугу практически за 3 минуты. Такой ветерок ... Моя единственная жалоба связана с названием ... Можете ли вы придумать лучшее имя, в котором используется слово "S ***"?

VenVig 23.01.2019 19:55

@VenVig, не могли бы вы рассказать мне, как вы запускали команду java -jar в качестве службы Windows? Любая помощь будет оценена по достоинству!

Nikhil Singh Bhadoriya 10.04.2020 10:30

@NikhilSinghBhadoriya извините, я не заметил этот вопрос до сих пор. Однако, если он вам все еще нужен, все, что я сделал, это поместил команду java -jar в пакетный файл Windows и направил NSSM для запуска этого пакетного файла в качестве службы.

VenVig 25.09.2020 22:48

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

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

Windows 7C:\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

Если вы используете Gradle Build Tool, вы можете попробовать мой плагин службы Windows, который облегчает использование Демон Procrun Apache Commons.

Чтобы создать 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.

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

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

Недооцененный ответ!

TaylanKammer 05.12.2018 12:47

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

-родной тип Создавайте автономные пакеты приложений (если возможно). Используйте параметр -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.

Этот ответ не отвечает на вопрос. Javapackager нельзя использовать для создания службы Windows напрямую, а скорее создать автономный исполняемый файл, например включает jre и другие ресурсы.

tobias_ 23.11.2017 12:11

Другие вопросы по теме