【问题标题】:Running the perl script file present in the jar file运行 jar 文件中的 perl 脚本文件
【发布时间】:2026-01-10 08:20:04
【问题描述】:

我是 perl 新手,但在 java 中进行了一些编程,但在运行 jar 文件中的 perl 脚本时遇到了问题。

我正在使用 windows,并且我编写了一个 perl 脚本来将一种类型的文件转换为另一种类型。

我已经使用运行时检查了带有 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 脚本。

【问题讨论】:

    标签: java perl executable-jar


    【解决方案1】:

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


    另见

    【讨论】:

      【解决方案2】:

      我假设你的 jar 中有你的 perl 脚本文件并且你不想提取它,只需“从内部”执行它。

      一种解决方案是获取“资源”(perl 脚本)的“流”,然后在进程的标准输入中执行“perl”编写脚本。

      用一段代码可以更好地解释这一点:

      重要警告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();
      

      【讨论】: