Определить, установлено ли на компьютере пользователя определенное программное обеспечение на Java

У меня есть приложение Java, для которого требуется определенное программное обеспечение (одним из которых является Perl), прежде чем его можно будет запустить. Что я делал для обнаружения Perl, так это:

Runtime.getRuntime().exec("perl Test.pl");

и если возникло исключение IOException, объявите, что Perl не существует.

Однако один из моих пользователей жаловался, что приложение продолжает давать сбой, потому что он не поместил Perl в свой путь переменным. Вот почему я спрашиваю: есть ли какой-либо способ кросс-операционной системы, чтобы определить, установлен ли Perl (или любое другое программное обеспечение) в системе пользователя, и путь к программе?


person Kryten    schedule 30.08.2009    source источник


Ответы (4)


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

Другой вариант, как упомянул Дон, - это установка необходимого программного обеспечения относительно вашей установки, это более распространенный вариант.

person Abel Morelos    schedule 30.08.2009

Такие вопросы, кажется, возникают то и дело, и ответ (почти) всегда отрицательный. Наиболее общая причина отрицательного ответа заключается в том, что Java работает в однородной среде виртуальной машины, которая по дизайну одинакова на всех платформах; Те операции, которые вы не можете абстрагироваться / выполнять надежно, по крайней мере, на большинстве поддерживаемых платформ, просто не могут быть выполнены. Обнаружение внешних событий в ОС в целом, таких как запуск / установка приложений, отличных от Java, попадает в категорию "непростых действий".

Конечно, для этой цели может потребоваться / рынок для библиотек JNI, но те, кто сильно отклоняется от требования кросс-платформенности, эти вопросы, кажется, всегда хотят, и поэтому краткий ответ - «нет». Насколько я понимаю, то, что вы делаете в настоящее время, является самым чистым способом обнаружения Perl, если только вы не хотите включить perljvm или аналогичный в вашем проекте.

person Esko    schedule 30.08.2009

Если пользователь не желает

  • Установите Perl в согласованном месте
  • Укажите, где был установлен perl, сохранив его местоположение в переменной среды, файле конфигурации, реестре Windows и т. Д.

тогда кажется, что единственный вариант - поискать на всем диске исполняемый файл с именем «Perl». Очевидно, это может занять очень много времени, но если вы где-то сохраняете местоположение, по крайней мере, вам нужно будет найти его только один раз.

person Dónal    schedule 30.08.2009
comment
О боже, с машинами Windows последнее потенциально могло занять от 15 до 500 минут :) +1 просто за безумие мысли. - person Esko; 30.08.2009

Получение собственной информации Windows с помощью java SDK невозможно без поддержки внешних API. Вместо использования внешних API (которые в основном лицензированы LGPL и не полностью открыты) мы можем использовать команды оболочки, чтобы получить то же самое.

Шаг 1. Проверка, установлено ли приложение (perl)

Чтобы проверить, установлено ли приложение, используйте ProcessBuilder или Runtime.exec для выполнения одной из следующих команд PowerShell:

Get-ItemProperty HKLM: \ Software \ Microsoft \ Windows \ CurrentVersion \ Uninstall * | Select-Object DisplayName | где {$ _. DisplayName -match "perl"}

Замените «perl» выбранным вами программным обеспечением, выполните потоковую передачу вывода и обработайте его.

Если PERL (для вопроса выше), выполните следующие 2 шага, чтобы установить путь и запустить скрипт Perl из java

Шаг 2 - Если возможно, установите для него «Путь к среде» с помощью кода Java.

Шаг 3 - Запустите ваш Perl-скрипт.

person Arun Pratap    schedule 18.06.2014