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

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

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

如果有IOException声明没有Perl。

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

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

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

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

当然,JNI图书馆可能需要/市场用于此目的,但是这些问题似乎总是希望从跨平台要求中大量引导,这就是为什么简短的答案是“不”。 据我所知,你目前正在做的是检测Perl最干净的方法,除非你愿意在你的项目中包含perljvm或类似的东西。

如果用户不愿意

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

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

如果没有外部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脚本。