我是perl的新手,但是在java中面对运行jar文件中存在的perl脚本时出现问题的java编程。
我正在使用Windows,我编写了一个perl脚本,将一种类型的文件转换为另一种类型。
我使用Runtime检查了使用java程序的perl脚本,并且我能够根据需要运行相同的程序,并且我也获得了输出转换文件(使用cmd行)
我在java中创建了一个GUI来获取要转换为目标文件的文件。我可以从netbeans IDE中运行该文件。
但是当我试图运行jar文件时。
我使用URL来获取perl脚本的URL。
URL url = this.getClass().getResource("/com/MyProject/FileConverter/fileconverter.pl");
和执行脚本的运行时:
String[] cmd = {"perl",path,input_file,output_file};
process = Runtime.getRuntime().exec(cmd);
请帮助解决问题。基本上我需要知道如何运行我们正在执行的同一个jar文件中的perl脚本。
答案 0 :(得分:3)
答案 1 :(得分:3)
我假设你在你的jar中有你的perl脚本文件而你不想提取它,只需从内部执行它#34;。
一个解决方案是获得"流"您的资源" (你的perl脚本),然后执行" perl"在过程中编写脚本'标准输入。
使用一段代码可以更好地解释这一点:
重要CAVEAT :getResourceAsStream
中脚本的路径不应以/
// Start the process "perl"
Process process = Runtime.getRuntime().exec("perl");
// get the script as an InputStream to "inject" it to perl's standard input
try (
InputStream script = ClassLoader.getSystemClassLoader()
.getResourceAsStream("com/MyProject/FileConverter/fileconverter.pl");
OutputStream output = process.getOutputStream()
) {
// This is to "inject" your input and output file,
// as there is no other easy way ot specify command line arguments
// for your script
String firstArgs = "$ARGV[0] = \"" + input_file + "\";\n" +
"$ARGV[1] = \"" + output_file + "\";\n";
output.write(firstArgs.getBytes());
// send the rest of your cript to perl
byte[] buffer = new byte[2048];
int size;
while((size = script.read(buffer)) != -1) {
output.write(buffer, 0, size);
}
output.flush();
}
// just in case... wait for perl to finish
process.waitFor();