检测用户的计算机上是否安装了某些Java软件

时间:2009-08-30 16:10:09

标签: java operating-system detect

我有一个Java应用程序,它需要某些软件(其中一个是Perl)才能运行。我以前用来检测Perl的是:

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

如果有IOException,则声明没有Perl。

然而,我的一位用户抱怨该应用程序仍然失败,因为他没有将Perl放在他的路径变量中。所以这就是为什么我要问:是否有任何跨操作系统方式来检测用户系统上是否安装了Perl(或任何其他软件)以及程序的路径?

4 个答案:

答案 0 :(得分:6)

这些问题似乎时不时出现,答案(差不多)总是没有。否定答案的最普遍原因是Java在同质的虚拟机环境中运行,在所有平台上设计相同;您无法在至少最受支持的平台上可靠地抽象/可靠地执行的操作无法轻松完成。通常,检测OS中的外部事件(例如,还运行/安装了哪些非Java应用程序)属于“不容易做”的类别。

当然,JNI图书馆可能需要/市场,但是这些问题总是出现在跨平台要求中,这些问题似乎总是希望这样,这就是为什么简短的回答是“不” 。据我所知,您目前正在做的是检测Perl最干净的方法,除非您愿意在项目中包含perljvm或类似内容。

答案 1 :(得分:3)

如果用户不愿意

  • 在商定的位置安装perl
  • 通过将perl的位置存储在环境变量,配置文件,Windows注册表等中来指示perl的安装位置。

那么似乎你唯一的选择就是在整个磁盘上搜索一个名为'Perl'的可执行文件。显然这可能需要很长时间,但如果你将位置存储在某个地方,至少你应该只需要搜索一次

答案 2 :(得分:1)

我不知道您的目标受众(用户),但是在失败时您可以提示用户输入路径(FileChooserDialog),然后存储此路径以供将来使用(如果不再次抛出异常)。我之前做过那个,幸运的是我有用户是SysAdmins,所以他们在第一次发生错误时提供该信息是可以的(我还记录了如何在属性文件中更新或更改这些值)。 / p>

Don提到的其他选项是安装相对于您的安装所需的软件,这是一个更常见的选项。

答案 3 :(得分:0)

如果不支持外部API,则无法使用java SDK获取Windows本机信息。我们可以使用shell命令来获取相同的内容,而不是使用外部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个步骤设置路径并从java运行perl脚本

步骤2 - 如果可用,使用java代码将其设置为Environment Path。

第3步 - 运行perl脚本。