Я столкнулся с очень неясной проблемой, в то время как я пытаюсь запустить приложение 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. НЕ РАБОТАЕТ
У нас была аналогичная проблема с загрузкой родной DLL через JNI, которая требовала сборки sxs. Мы закончили чтение манифеста из ресурсов и создание контекста активации вручную в коде на C++. Не уверен, есть ли лучший способ. Попробуйте вызвать дочерний процесс через ShellExecute? – Eugene
Понятия не имею, но описание команды 'java', кажется, стоит прочитать http://docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html – clwhisk
@clwhisk проблема не в java.Проблема заключается в том, как ОС Windows загружает java-команду. Кажется, что родительский dir процесса java (когда его вызывает Windows) - это C: \ Windows, поэтому csrss.exe не может найти файл java.exe.manifest для конфигурации SxS. – nikkatsa