2013-09-16 4 views
11

Я столкнулся с очень неясной проблемой, в то время как я пытаюсь запустить приложение java в Windows Side by Side (SxS).Конфигурация Java SxS (бок о бок)

Я сделал всю подготовку, создав файлы java.exe.config и java.exe.manifest, которые у меня есть в той же папке с JRE.

Приложение работает нормально, когда я вызываю его из командной строки (запустив файл .bat). Файл .bat использует SxS сконфигурировано Java (который является единственным в поле я бегу приложение)

Однако, когда я пытаюсь вызвать его внутри другого процесса Java (с использованием Runtime.getRuntime.exec()) или ProcessBuilder, кажется, он полностью игнорирует конфигурацию SxS, а дочерний процесс Java жалуется, что он не может найти библиотеки COM, которые были причиной, по которой мне приходилось делать SxS. Я должен добавить, что родительский процесс Java также запускается Java.exe, который настроен для SxS. Таким образом, я бы предположил, что «Runtime.getRuntime(), ProcessBuilder()» предоставит мне загруженную среду Java SxS.

Выполнение дополнительной отладки с использованием некоторых инструментов Windows (procexp.exe, procmon.exe), я узнал следующее: Когда я запускаю приложение из .bat-файла, файл .manifest обычно считывается с помощью crss.exe (as это должно быть). Однако, когда другой процесс порождается Java, файл .manifest НЕ принимается во внимание вообще. Одна из возможных проблем, о которых я мог думать, это то, что текущий каталог Java.exe, который запускает этот процесс, не совпадает с файлом java.exe.manifest.

Единственная вещь, о которой я могу думать, это ошибка/проблема (или, возможно, они называют ее функцией) в java-пусковой установке.

У кого-нибудь была аналогичная проблема? Может ли кто-нибудь пролить свет на вышесказанное? Очень признателен.

До сих пор я попытался следующее:

  • Запуск процесса Java внутри файла .bat. WORKED
  • Вызывается процесс Java из родительского процесса Java с использованием Runtime.getRuntime().exec(). DID NOT WORK
  • Invoked the .bat file from a parent Java process using Runtime.getRuntime().exec(). НЕ РАБОТАЕТ
  • Используется ProcessBuilder, устанавливающий текущий каталог, в котором находится файл .manifest. НЕ РАБОТАЕТ
+0

У нас была аналогичная проблема с загрузкой родной DLL через JNI, которая требовала сборки sxs. Мы закончили чтение манифеста из ресурсов и создание контекста активации вручную в коде на C++. Не уверен, есть ли лучший способ. Попробуйте вызвать дочерний процесс через ShellExecute? – Eugene

+0

Понятия не имею, но описание команды 'java', кажется, стоит прочитать http://docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html – clwhisk

+0

@clwhisk проблема не в java.Проблема заключается в том, как ОС Windows загружает java-команду. Кажется, что родительский dir процесса java (когда его вызывает Windows) - это C: \ Windows, поэтому csrss.exe не может найти файл java.exe.manifest для конфигурации SxS. – nikkatsa

ответ

1

Я тестировал его на своем компьютере, и он работает. Попробуйте:

  • читать getErrorStream() из Runtime.getRuntime(). Exec (...); и отправьте сюда, если вы не можете решить это,
  • запустить процесс с полным путем (C: \ Program ...),
  • скомпилировать java-программу в .jar, поместить в папку с .bat, открыть CMD , установите текущий каталог в эту папку и запустите файл jar (с помощью java -jar filename.jar),