2012-05-29 3 views
1

У меня есть приложение Java Wrapper, которое обращается к записям реестра. (Да, я знаю, странно, а? В случае, если вам интересно, я использую решение Дэвида this question для чтения из реестра с использованием Java.)Неисправность с помощью Java Service Wrapper при запуске из консоли или запустите как службу

Все работает отлично в 32-разрядных версиях Windows. Я могу запускать свое приложение с обеих консолей (используя файл байт Java Wrapper.) И как сервис, установленный из файла bat. Я вижу различные вещи, которые мне нужны из реестра Windows.

Однако в 64-разрядной системе Windows я больше не могу видеть записи реестра, которые мне нужны, когда я запускаю приложение в качестве службы; все записи выглядят как null. Однако он все еще работает в консоли!

Моя гипотеза заключается в том, что при запуске с консоли (как административный пользователь, в случае ее значимости), Java Service Wrapper запускает 64-разрядную JVM и имеет доступ к регулярному 64-разрядному реестру. Затем, когда он запускается как служба (через пользователя LOCALSYSTEM), он запускает 32-разрядную JVM (которая затем попытается получить доступ к специальному 32-разрядному реестру oh-so-s на узле Wow6432bit. Записи, которые я ищу, это отсутствующий на этом узле, который затем объяснит, почему я получаю в этом случае нулевые значения.

Это приводит к моему вопросу: почему на Земле Java Wrapper запустит 32-разрядную JVM при запуске через список сервисов и почему бы это начать 64-разрядную JVM при запуске из консоли

ПРИМЕЧАНИЯ: Я использую Java Service Wrapper 3.5.14 и в моей конфиге у меня есть

wrapper.java.additional.auto_bits=TRUE

В идеале я хотел бы, чтобы выбор JVM был автоматическим, поэтому я могу использовать один установщик для развертывания моего программного обеспечения как в 32-битной, так и в 64-разрядной системах. (Это одна из причин, по которой я решил использовать JSW поверх Tomcat.)

Большое спасибо за чтение.

ответ

1

Оказалось, что мой установщик (который я использовал для установки и запуска службы) - это 32-разрядное приложение, которое заставляет файлы байт Java Wrapper работать в 32-разрядной среде во время процесса установки , Поскольку в 64-разрядной системе нет 32-битной Java, это означает, что оболочка не может найти Java.

Трюк (который я узнал от полезных людей в поддержке Tanuki Software) - сообщить файлу .bat для запуска 64-разрядной оболочки, если известно, что мы работаем в 32-разрядной среде на 64 .

В основном, в .bat-файле найдите эти строки и вставьте указанную строку. Если я столкнусь с дополнительными проблемами, я обновлю свой ответ. Но пока это решение, похоже, хорошо работает для меня довольно хорошо.

rem 
rem Decide on the specific Wrapper binary to use (See delta-pack) 
rem 
if "%PROCESSOR_ARCHITEW6432%"=="AMD64" goto amd64 (<---- insert this line) 
if "%PROCESSOR_ARCHITECTURE%"=="AMD64" goto amd64 
if "%PROCESSOR_ARCHITECTURE%"=="IA64" goto ia64 
+2

добро пожаловать :) – Naytzyrhc