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

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

Ответ 2

Apache Commons Daemon - хорошая альтернатива. Он имеет Procrun для служб Windows и Jsvc для демонов unix. Он использует менее ограничительную лицензию Apache, и Apache Tomcat использует ее как часть себя для работы в Windows и Linux! Получить его работу немного сложно, но есть 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()" вызовут ошибки. Если вы не можете изменить эти вызовы, подумайте над созданием класса начальной загрузки, который может массировать эти вызовы в соответствии с вашими потребностями.

Ответ 3

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

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

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

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

Ответ 4

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

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

Ответ 6

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

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

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

Ответ 7

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

Ответ 8

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

Ответ 9

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

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

Ответ 11

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

Ответ 12

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

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

Ответ 13

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

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

Ответ 14

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

Ответ 15

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

чао!

Ответ 16

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

Windows 7 C:\users\All Users\Start Menu\Programs\Startup (Admin) или User home directory(%userProfile%)

Windows 10: В Run shell:startup

в нем свойство → ярлык → target → 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

Ответ 17

Если вы используете Gradle Build Tool, вы можете попробовать windows-service-plugin, что облегчает использование Apache Commons Daemon Procrun.

Чтобы создать приложение-приложение для Java-приложений с помощью плагина, вам нужно пройти несколько простых шагов.

  • Создайте основной класс службы с помощью соответствующего метода.

    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
            }
        }
    
    }
    
  • Включите плагин в ваш файл 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"
    

    Тот же самый script фрагмент для нового, инкубационного, плагинового механизма, представленного в Gradle 2.1:

    plugins {
      id "com.github.alexeylisyutenko.windows-service-plugin" version "1.1.0"
    }
    
  • Настроить плагин.

    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'
    }
    
  • Запустите createWindowsService Gradle задачу для создания дистрибутива службы 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.

Ответ 18

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

В случае с окнами ссылайтесь на doc, мы можем при необходимости создать msi или exe.

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

Ответ 19

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