【发布时间】:2010-10-10 20:28:53
【问题描述】:
我读到Runtime.getRuntime().exec("perl script.pl") 是一个选项,但这是最好的方法吗?
我需要那个脚本的答案,所以在某些情况下我必须读取脚本的返回值,但在其他情况下我可能会从文本文件中读取它。
无论如何,exec() 是从 Java 调用 Perl 脚本的好方法吗?我应该注意,我正在开发一个 Java Web 应用程序,所以这里的安全性是一个问题。
【问题讨论】:
我读到Runtime.getRuntime().exec("perl script.pl") 是一个选项,但这是最好的方法吗?
我需要那个脚本的答案,所以在某些情况下我必须读取脚本的返回值,但在其他情况下我可能会从文本文件中读取它。
无论如何,exec() 是从 Java 调用 Perl 脚本的好方法吗?我应该注意,我正在开发一个 Java Web 应用程序,所以这里的安全性是一个问题。
【问题讨论】:
您可以使用Runtime.getRuntime().exec() 或使用Process API。
Process API 允许您获取脚本的输出,因此您可以同时进行通信。
exitValue() 和 getInputStream() 似乎是您需要的。
【讨论】:
这概述了如何相当优雅地做到这一点,尽管它可能比它值得付出更多的努力: http://search.cpan.org/~nwclark/perl-5.8.9/jpl/docs/Tutorial.pod
概述:
得到 JPL 的良好支持,但这是一个复杂的过程:
JPL 预处理器解析 .jpl 文件并为 Perl 方法生成 C 代码包装器。它还生成 Java 和 Perl 源文件。
C 编译器编译包装器并将其链接到 libPerlInterpreter.so 共享库,从而为包装器生成一个共享库。
Java 编译器编译 Java 源文件,该文件使用本地方法加载包装器。
包装器将 Java 代码连接到 Perl 源文件中的 Perl 代码。
幸运的是,通用的 Makefile.PL 简化了该过程。这是一个为您生成 Makefile 的 Perl 脚本。
【讨论】:
exec() 可能是最好的选择,您可以使用exitValue() 捕获它的返回值。您可能还对Inline::Java 感兴趣。
-约翰
【讨论】:
请记住,无论 Perl 脚本创建什么文件,它都是在 Java 工作文件夹中创建的。只需将该文件称为'./myPerlCreatedFile.ext'
【讨论】: