Як створити службу Windows з програми Java


220

Я щойно успадкував програму java, яку потрібно встановити як сервіс на XP та vista. Минуло близько 8 років, як я використовував Windows у будь-якій формі, і мені ніколи не доводилося створювати сервіс, не кажучи вже про щось на зразок програми java (у мене є баночка для додатка та одна банка залежностей - log4j ). Яка магія необхідна, щоб зробити цей запуск як послугу? У мене є джерело, тому можливі зміни коду, хоч і бажано уникати.


Інша пропозиція stackoverflow.com/a/9262081/381897
bhdrkn

1
Просто для повноти: тут сервер default.com/a/259195 він говорить, що програма повинна відповідати на зворотні виклики диспетчера служб управління. Прочитайте цей підручник він використовує Procrun ticklingmind.blogspot.com/2010/03 / ...
Broken_Window

Відповіді:


69

Мені пощастило з Java Service Wrapper


11
Java Service Wrapper виглядає дуже корисною. Але я переглянув список функцій. Вам просто потрібно знати, що версія спільноти не ліцензується для використання на сервері.
Брайан Меттьюз

Це може бути проблемою. Це було кілька років тому, як я ним користувався. Здогадайтесь, вони вирішили стягувати плату.
sblundy

Ця обгортка використовується у багатьох проектах з відкритим кодом, включають декілька на Jakarta Apache, наприклад, ActiveMQ.
Тодд

7
wrapper.tanukisoftware.org/doc/english/licenseCommunity.html Закрите джерело використання GPL не обмежує розробку приватного програмного забезпечення для внутрішнього використання, яке залежить від програмного забезпечення в GPL, якщо це програмне забезпечення ніколи не поширюється без повного джерела вся програма, доступна всім користувачам. Хоча ми заохочуємо корпоративних та державних користувачів використовувати або Серверну, або Ліцензійну угоду для розробки, Ліцензійний договір Співтовариства є прийнятним до тих пір, поки заявка призначена для внутрішнього використання або завжди буде розповсюджуватися разом із повним її src.
Володимир

1
@ У Володимира 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, ваші методи запуску та зупинки повинні приймати параметри (String [] argv). Наприклад, "start (String [] argv)" і "stop (String [] argv)" буде працювати, але "start ()" і "stop ()" спричинить помилки. Якщо ви не можете змінити ці дзвінки, подумайте про створення класу завантажувача, який може масажувати ці дзвінки відповідно до ваших потреб.


Використовуючи роздуми, ви, ймовірно, могли обійти проблему, про яку ви заявили в останньому абзаці. Також демон apache commons є єдиною обгорткою, про яку я знаю, що має попередньо вбудовані 64-бітні бінарні файли для вільного використання.
djangofan

Вам потрібно повернути вагон між усіма параметрами JVM. Наприклад, якщо у вас є одна лінія -Dopt1 = a -Dopt2 = b, вона може не працювати. Щоб це виправити, потрібно написати --JvmOptions=-Dopt=a#-Dopt2=b. Я запускав команду з мурашиного сценарію і боровся цілими днями через це. Сподіваюся, це допомагає.
Сідней

Стаття, про яку ви говорили, вже давно не існує ... Чи все ще є спосіб дійти до неї? У мене виникають проблеми з тим, щоб Apache Commons Daemon зробив те, що мені потрібно.
11101101b

3
@ 11101101b, схоже, apache приєднав кишки статті до власної сторінки wiki ...
Лукас

@community wiki, я використовував Apache Commons Daemon для 64-бітної машини Windows, це послуга успішно додала. в той час як я використовую ті самі процеси для 32-бітної машини Windows 7, вона не може додати сервіс.
Шакті

59

З програмою Apache Commons Daemon тепер ви можете мати ім’я та піктограму, що виконується на замовлення! Ви також можете отримати спеціальний монітор лотка для Windows з власним іменем та значком!

Тепер у мене служба працює зі своїм іменем та значком (prunsrv.exe), а монітор системного трея (prunmgr.exe) також має власне власне ім’я та значок!

  1. Завантажте бінарні файли Daemon Apache Commons (вам знадобляться 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, яка працюватиме з вашою власною іконою та іменем! Ви також можете запустити файл монітора, і він буде працювати в системному треї з вашим власним значком та іменем.


1
Я все робив відповідно до вашого Як, але це не змінює значок символу .. будь-яка ідея чому?
outofBounds

Вибачте @outofBounds, я ще не бачив ваш коментар. Програма RCEDIT.exe - це те, що змінює піктограму виконуваного Вами служби. Переконайтеся, що у вас є дійсний .ico-файл із кожним розміром, визначеним правильно. Ви можете побачити , як створити відповідний файл .ico тут: stackoverflow.com/questions/4354617 / ...
11101101b

2
Щоб ви знали, у назві служби не може бути пробілів.
11101101b

1
Так @Shakthi, він прекрасно працює в 32 та 64-бітних Windows XP, 7, 8, 8.1, Server 2003, 2008 та 2012 рр.
11101101b

1
Так, @Syamsoul Azrein, він чудово працює на 10 та будь-якому сервері.
11101101b

31

Простий спосіб - це NSSM Wrapper Wrapper ( див. Мій запис у блозі ).


7
НССМ РОККИ! Я легко виготовляю обгортку навіть із своєї програми java. Легкий, легкий, працює - 100кб щастя! Дякую!
cynepnaxa

1
Будь-який приклад, як використовувати NSSM Wrapper для запуску програми java (я використовую HelioSearch) як службу Windows у фоновому режимі при запуску системи?
Крунал

@GiordanoMaestro запис до вашого блогу більше не доступний. У вас є ще одне посилання?
Матьє

2
Порівняно з Daemon Apache Commons, wrapper.tanukisoftware.org та yajsw, NSSM на сьогодні був найшвидшим та найпростішим варіантом для перетворення простого додатка java у сервіс Windows
Jeffrey Knight

Я намагаюсь використовувати NSSM для запуску виконуваного вами весняного завантаження. Я отримав цю помилку "Неочікуваний статус SERVICE_PAUSED у відповідь на контроль START".
Кіран Кумар

26

Ще один варіант - WinRun4J . Це налаштований Java-запуск, який виступає в якості хоста служби Windows (як 32, так і 64-бітні версії). Він є відкритим кодом, і немає обмежень щодо його використання.

(повне розкриття: я працюю над цим проектом).


3
Дякую за це Я спробував YAJWS, і спочатку це мене налякало завантаженням на 19 Мб, а після того, як я дотримувався інструкцій, він показав "командний рядок помилки аналізу". Я переглянув PROCRUN, і він занадто громіздкий для швидкого налаштування. INSTSRV / SRVANY вимагає змін у реєстрі! Launch4J пакує JAR всередині EXE, тому це ускладнює розгортання. WinRun4J був ідеально підходить. Єдиний недолік - це те, що для роботи як сервісу потрібен спеціальний клас (замість того, щоб просто викликати стандартний основний клас). Але загалом це 99% ідеально.
fernacolo

2
FYI, остання версія має обгортку для стандартного основного класу.
Пітер Сміт

Привіт, Ви можете навести який-небудь приклад, який пояснює, як це використовувати? Я хотів би використовувати його для запуску HelioSearch екземпляра як сервісу фонових вікон при запуску системи.
Крунал

17

Ще одна відповідь - Ще один Java Service Wrapper , це здається гарною альтернативою Java Service Wrapper, оскільки має кращі ліцензування. Крім того, передбачається легко перейти від JSW до YAJSW. Безумовно, для мене, абсолютно новим для серверів Windows і намаганням запустити додаток Java як сервіс, було дуже просто у використанні.

Деякі інші я знайшов, але не закінчив використовувати:

  • Java Service Launcher Я цим не користувався, тому що це було складніше в роботі, ніж YAJSW. Я не думаю, що це обгортка.
  • Послуги JSmooth Creating Window не є його основною метою, але це можна зробити . Я не користувався цим, тому що не було жодної активності з 2007 року.

+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. Запустіть 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.


Занижена відповідь!
TaylanUB



3

це просто, оскільки вам потрібно ввести ярлик

Windows 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


3

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

У випадку, якщо Windows посилається на наступний документ, ми можемо створити msi або exe за потребою.

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

5
Ця відповідь не стосується питання. Javapackager не можна використовувати для створення служби Windows безпосередньо, а скоріше для створення автономного виконуваного файлу, який, наприклад, включає jre та інші ресурси.
tobias_

3

Використовуйте " winw ", який був написаний для Glassfish v3, але добре працює з програмами Java в цілому.

Потрібна версія .NET для встановлення.


Тим часом нинішня версія (підтримувана відомим Косуке Кавагучі) розміщена тут .
FrVaBe

Схоже, він перемістив його до github після версії 1.9 (швидше за все, коли він перейшов з Oracle до Cloudbees).
Thorbjørn Ravn Andersen

2

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


GForge припинено
lv

2

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

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


Чи можете ви надати зразок хаку, який ви зробили з "perl" ..!
peaceUser

2

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

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


1
Це дозволяє вам запустити щось як послугу, але, на моє розуміння, це було б від'єднано, тобто ви не змогли зупинити це через Служби або перезапустити автоматично, і т. Д. Я можу бути абсолютно невірним - хоч це тільки почав вивчати.
atomicules

1

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


1

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

чіао!


-1

Exe4j - дуже хороший варіант, хоча він не безкоштовний. Перевірте це за допомогою Exe4j У майстрі створення файлу .exe ви надаєте можливість створити службу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.