我有一个Java应用程序,需要在运行之前安装某些软件(其中之一是Perl)。我过去用来检测Perl的方法是:
Runtime.getRuntime().exec("perl Test.pl");
如果有IOException,则声明没有Perl。
然而,我的一个用户抱怨说应用程序一直失败,因为他没有将Perl放在他的路径变量中。所以我想问:是否有跨操作系统的方法来检测用户系统上是否安装了Perl(或任何其他软件)以及程序的路径?
我有一个Java应用程序,需要在运行之前安装某些软件(其中之一是Perl)。我过去用来检测Perl的方法是:
Runtime.getRuntime().exec("perl Test.pl");
如果有IOException,则声明没有Perl。
然而,我的一个用户抱怨说应用程序一直失败,因为他没有将Perl放在他的路径变量中。所以我想问:是否有跨操作系统的方法来检测用户系统上是否安装了Perl(或任何其他软件)以及程序的路径?
如果用户不愿意在约定好的位置安装Perl,或者通过将其位置存储在环境变量、配置文件、Windows注册表等中来指示Perl已经安装,则您唯一的选择似乎是在整个磁盘上搜索名为“Perl”的可执行文件。显然,这可能需要很长时间,但如果您在某处存储了位置,那么至少您只需要搜索一次。
我不知道你的目标受众(用户)是谁,但如果失败了,你可以提示用户输入路径(一个FileChooserDialog),然后将此路径存储以供将来使用(如果异常没有再次抛出)。我曾经这样做过,幸运的是,我的用户都是系统管理员,所以当错误发生时,他们提供这些信息是可以的(我还记录了如何在属性文件中更新或更改这些值)。
另一种选择是像Don提到的那样,将所需软件安装为相对于你的安装位置,这是更常见的选项。
使用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脚本。