2

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

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

如果有 IOException 声明没有 Perl。

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

4

4 回答 4

6

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

当然,出于此目的,JNI 库可能存在需求/市场,但那些严重依赖跨平台需求的人似乎总是想要这些问题,这就是为什么简短的回答是“不”。据我所知,除非您愿意在项目中包含perljvm或类似的东西,否则您目前正在做的是检测 Perl 的最干净的方法。

于 2009-08-30T16:20:29.730 回答
3

如果用户不愿意

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

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

于 2009-08-30T16:21:23.240 回答
1

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

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

于 2009-08-30T16:29:30.680 回答
0

如果不支持外部 API,则无法使用 java SDK 获取 Windows 本机信息。我们可以使用 shell 命令来获得相同的功能,而不是使用外部 API(主要是 LGPL 许可且未完全开放)。

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

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

获取项目属性 HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall* | 选择对象显示名称 | 其中 {$_.DisplayName -match "perl"}

用您选择的软件替换“perl”并流式传输这些输出并进行处理。

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

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

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

于 2014-06-18T19:30:53.287 回答