我有一个Java应用程序,它需要某些软件(其中之一是Perl)才能运行。我用来检测Perl的方法是:
Runtime.getRuntime().exec("perl Test.pl");
字符串如果有IOException,则声明没有Perl。然而,我的一个用户抱怨说,应用程序一直失败,因为他没有把Perl放在他的路径变量。所以这就是为什么我问:有没有跨操作系统的方法来检测Perl(或任何其他软件)是否安装在用户的系统和程序的路径?
qij5mzcb1#
这类问题似乎时不时地冒出来,答案 (几乎) 总是否定的。否定答案的最常见原因是Java运行在一个同质的虚拟机环境中,该环境在所有平台上都是相同的;那些你无法抽象的操作/至少在大多数支持的平台上可靠地做,这是不容易做到的。检测操作系统中的外部事件,比如哪些非Java应用程序也在运行/安装,福尔斯属于“不容易做到”的类别。当然,JNI库可能会有需求/市场,但这些库严重偏离了 * 跨平台 * 的要求,这些问题似乎总是想要,这就是为什么简短的答案是“否”。据我所知,你目前所做的是最干净的方法来检测Perl,除非你愿意在你的项目中包含perljvm或类似的东西。
bxpogfeg2#
如果用户不愿意,
那么似乎你唯一的选择就是在整个磁盘上搜索一个名为“Perl”的可执行文件。显然这可能需要很长时间,但是如果你把位置存储在某个地方,至少你只需要搜索一次就可以了。
wooyq4lh3#
我不知道你的目标受众(用户),但在失败时,你可以提示用户输入路径(一个FileToolserDialog),然后存储此路径以备将来使用(如果异常没有再次抛出)。我以前做过,幸运的是我有用户是系统管理员,因此,当第一次发生错误时,他们可以提供这些信息(我还在属性文件中记录了如何更新或更改这些值)。Don提到的另一个选项是安装所需的软件,这是一个更常见的选项。
up9lanfz4#
如果没有外部API的支持,使用java SDK获取windows本机信息是不可能的。我们可以使用shell命令来获取相同的信息,而不是使用外部API(大部分是LGPL许可的,并且不完全开放)。
步骤1 -检查是否安装了(perl)应用程序
要检查是否安装了应用程序,请使用ProcessBuilder或Process.exec运行以下PowerShell命令之一,
将“perl”替换为您选择的软件,并流式传输这些软件的输出并处理它。
步骤2 -如果可用,使用Java代码将其设置为环境路径。第3步-运行你的Perl脚本。
4条答案
按热度按时间qij5mzcb1#
这类问题似乎时不时地冒出来,答案 (几乎) 总是否定的。否定答案的最常见原因是Java运行在一个同质的虚拟机环境中,该环境在所有平台上都是相同的;那些你无法抽象的操作/至少在大多数支持的平台上可靠地做,这是不容易做到的。检测操作系统中的外部事件,比如哪些非Java应用程序也在运行/安装,福尔斯属于“不容易做到”的类别。
当然,JNI库可能会有需求/市场,但这些库严重偏离了 * 跨平台 * 的要求,这些问题似乎总是想要,这就是为什么简短的答案是“否”。据我所知,你目前所做的是最干净的方法来检测Perl,除非你愿意在你的项目中包含perljvm或类似的东西。
bxpogfeg2#
如果用户不愿意,
那么似乎你唯一的选择就是在整个磁盘上搜索一个名为“Perl”的可执行文件。显然这可能需要很长时间,但是如果你把位置存储在某个地方,至少你只需要搜索一次就可以了。
wooyq4lh3#
我不知道你的目标受众(用户),但在失败时,你可以提示用户输入路径(一个FileToolserDialog),然后存储此路径以备将来使用(如果异常没有再次抛出)。我以前做过,幸运的是我有用户是系统管理员,因此,当第一次发生错误时,他们可以提供这些信息(我还在属性文件中记录了如何更新或更改这些值)。
Don提到的另一个选项是安装所需的软件,这是一个更常见的选项。
up9lanfz4#
如果没有外部API的支持,使用java SDK获取windows本机信息是不可能的。我们可以使用shell命令来获取相同的信息,而不是使用外部API(大部分是LGPL许可的,并且不完全开放)。
步骤1 -检查是否安装了(perl)应用程序
要检查是否安装了应用程序,请使用ProcessBuilder或Process.exec运行以下PowerShell命令之一,
将“perl”替换为您选择的软件,并流式传输这些软件的输出并处理它。
步骤2 -如果可用,使用Java代码将其设置为环境路径。
第3步-运行你的Perl脚本。