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

jjjwad0x  于 11个月前  发布在  Java
关注(0)|答案(4)|浏览(202)

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

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

字符串
如果有IOException,则声明没有Perl。
然而,我的一个用户抱怨说,应用程序一直失败,因为他没有把Perl放在他的路径变量。所以这就是为什么我问:有没有跨操作系统的方法来检测Perl(或任何其他软件)是否安装在用户的系统和程序的路径?

qij5mzcb

qij5mzcb1#

这类问题似乎时不时地冒出来,答案 (几乎) 总是否定的。否定答案的最常见原因是Java运行在一个同质的虚拟机环境中,该环境在所有平台上都是相同的;那些你无法抽象的操作/至少在大多数支持的平台上可靠地做,这是不容易做到的。检测操作系统中的外部事件,比如哪些非Java应用程序也在运行/安装,福尔斯属于“不容易做到”的类别。
当然,JNI库可能会有需求/市场,但这些库严重偏离了 * 跨平台 * 的要求,这些问题似乎总是想要,这就是为什么简短的答案是“否”。据我所知,你目前所做的是最干净的方法来检测Perl,除非你愿意在你的项目中包含perljvm或类似的东西。

bxpogfeg

bxpogfeg2#

如果用户不愿意,

  • 在约定的位置安装perl
  • 通过在环境变量、配置文件、windows注册表等中存储perl的位置来查找perl的安装位置。

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

wooyq4lh

wooyq4lh3#

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

up9lanfz

up9lanfz4#

如果没有外部API的支持,使用java SDK获取windows本机信息是不可能的。我们可以使用shell命令来获取相同的信息,而不是使用外部API(大部分是LGPL许可的,并且不完全开放)。

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

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

  • Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\PHP | 选择对象显示名称|其中{$_.DisplayName -match“perl”}

将“perl”替换为您选择的软件,并流式传输这些软件的输出并处理它。

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

步骤2 -如果可用,使用Java代码将其设置为环境路径。
第3步-运行你的Perl脚本。

相关问题