运行jar文件中存在的perl脚本文件

时间:2014-05-16 20:12:49

标签: java perl executable-jar

我是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脚本。

2 个答案:

答案 0 :(得分:3)

您必须将该perl文件作为资源读取并将其写在文件系统上的某个位置File(如this),然后将该路径传递给您的命令


另见

答案 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();