【问题标题】:How to run a .jar file from inside another java program?如何从另一个 java 程序中运行 .jar 文件?
【发布时间】:2009-11-25 16:28:28
【问题描述】:

我有一个 .jar 文件,可以在命令行上运行:

java -jar myFile.jar argument1

我想将此 .jar 的输出保存为另一个 java 程序中的字符串变量。

我该怎么做?

我尝试在我的程序中包含 myFile.jar 作为参考,并在我的程序中执行myFile.main(new String{"argument1"})。但这只是将结果打印到控制台,我不能在我的程序中使用结果。

希望这不会太混乱。

【问题讨论】:

    标签: java


    【解决方案1】:

    运行 Jar 文件要求您将 jar 文件包含在类路径中。这可以在运行时使用URLClassLoader 完成。只需构造一个URLClassLoader 并将jar 作为URL 之一。如果你知道类名(当然是全名),那么就调用它的forClass(...)。或者使用它的“findResources(String name)”检查清单文件。

    一旦你得到了这个类,你就可以使用反射来得到它的静态方法main

    再次看到你的问题,你知道类名,所以如果你确定jar文件已经在类路径中,那么你可以在你尝试的时候调用它。

    要捕获输出,您可以调用System.setOut(PrintStream out)System.setErrPrintStream out) 来更改打印流。您可以传递您创建的打印流。像这样:

    ByteArrayOutputStream BAOS = new ByteArrayOutputStream();
    PrintStream MyOut = new PrintStream(BAOS);
    System.setOut(MyOut);
    
    // Do something to have something printed out.
    ...
    
    String TheCaptured = new String(BAOS.toByteArray());

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      如果你不能包含另一个jar,

      你可以使用类似的东西

      Runtime re = Runtime.getRuntime();
      BufferedReader output;          
      try{ 
        cmd = re.exec("java -jar MyFile.jar" + argument); 
        output =  new BufferedReader(new InputStreamReader(cmd.getInputStream()));
      } catch (IOException ioe){
        ioe.printStackTrace();
      }
      String resultOutput = output.readLine();
      

      我知道我的代码并不像捕获异常等那样完美,但我认为这可以给你一个好主意。

      【讨论】:

        【解决方案3】:

        作为一个 Jar 文件,您可以将其添加到您的类路径中并自行调用程序的功能。您可能需要更多地了解 Jar 背后的逻辑才能在不输出信息的情况下使用它。

        我相信您正在寻找的是如何使用外壳执行 Jar 存档。一个例子可以be found here.

        【讨论】:

          【解决方案4】:

          看看 ProcessBuilder:

          http://java.sun.com/javase/6/docs/api/java/lang/ProcessBuilder.html

          它有效地创建了一个操作系统进程,然后您可以使用该进程捕获输出:

          process.getInputStream()

          行:

          processbuilder.redirectErrorStream(true)

          将在以下示例中合并输出流和错误流:

          例如

          public class ProcessBuilderExample {
          
              public ProcessBuilderExample() {
                  // TODO Auto-generated constructor stub
              }
              public static void main(String[] args) throws IOException, InterruptedException {
          
                  ProcessBuilder pb = new ProcessBuilder("java", "-jar", "gscale.jar");
                  pb.redirectErrorStream(true);
                  pb.directory(new File("F:\\Documents and Settings\\Administrator\\Desktop"));
          
                  System.out.println("Directory: " + pb.directory().getAbsolutePath());
                  Process p = pb.start();
                  InputStream is = p.getInputStream();
                  BufferedReader br = new BufferedReader(new InputStreamReader(is));
                  for (String line = br.readLine(); line != null; line = br.readLine()) {
                          System.out.println( line ); // Or just ignore it
                  }
                  p.waitFor();                    
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2013-08-01
            • 1970-01-01
            • 2015-07-12
            • 2013-07-15
            • 2016-03-01
            • 1970-01-01
            • 2013-02-19
            • 2013-06-30
            • 1970-01-01
            相关资源
            最近更新 更多