在Java中检测用户计算机上是否安装了特定软件

3

我有一个Java应用程序,需要在运行之前安装某些软件(其中之一是Perl)。我过去用来检测Perl的方法是:

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

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

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

4个回答

6
这类问题似乎经常出现,而答案(几乎)总是“不行”。否定答案的最普遍原因是Java在同质化虚拟机环境中运行,这种设计在所有平台上都是相同的;那些你无法抽象出来/在至少最受支持的平台上可靠地执行的操作很难做到。通常情况下,检测操作系统中的外部事件(例如,还运行/安装了哪些非Java应用程序)属于“难以实现”的范畴。
当然,可能需要/市场需要JNI库来实现这个目的,但这些库与这些问题总是想要的“跨平台”要求背道而驰,这就是为什么简短的答案是“不行”。就我所见,除非你愿意在项目中包含perljvm或类似的内容,否则你目前正在进行的是检测Perl的最清晰的方法。

3

如果用户不愿意在约定好的位置安装Perl,或者通过将其位置存储在环境变量、配置文件、Windows注册表等中来指示Perl已经安装,则您唯一的选择似乎是在整个磁盘上搜索名为“Perl”的可执行文件。显然,这可能需要很长时间,但如果您在某处存储了位置,那么至少您只需要搜索一次。


2
哦天哪,如果使用Windows机器,后者可能需要花费15到500分钟的时间:) +1仅因为这个想法疯狂。 - undefined

1

我不知道你的目标受众(用户)是谁,但如果失败了,你可以提示用户输入路径(一个FileChooserDialog),然后将此路径存储以供将来使用(如果异常没有再次抛出)。我曾经这样做过,幸运的是,我的用户都是系统管理员,所以当错误发生时,他们提供这些信息是可以的(我还记录了如何在属性文件中更新或更改这些值)。

另一种选择是像Don提到的那样,将所需软件安装为相对于你的安装位置,这是更常见的选项。


0

使用Java SDK获取Windows本机信息是不可能的,除非有外部API的支持。与其使用外部API(大多数是LGPL许可证,并非完全开放),我们可以使用shell命令来实现相同的功能。

步骤1 - 检查是否安装了应用程序(perl)

要检查是否安装了应用程序,请使用ProcessBuilder或Runtime.exec运行以下PowerShell命令之一:

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

将"perl"替换为您选择的软件,并流式传输输出并进行处理。

如果是PERL(针对上述问题),请按照以下2个步骤设置路径并从Java中运行perl脚本

步骤2 - 如果可用,请使用Java代码将其设置为环境路径。

步骤3 - 运行您的perl脚本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接