【问题标题】:How could I execute a jar from another program and display the results in another?如何从另一个程序执行 jar 并在另一个程序中显示结果?
【发布时间】:2013-02-26 23:18:50
【问题描述】:

我有 2 个 java 程序。一个是可执行的 jar,它将向控制台返回 hello world 的值。下面列出..

public class MainClass {


    public static void main(String[] args) {
        helloWorldSubRoutine();

    }

    public static void helloWorldSubRoutine () {

        String helloWorld = "Hello there!";
          System.out.println(helloWorld);

    }

}

另一个程序是一个简单的 jframe,带有一个标签,我希望它显示来自另一个 jar 的返回值或字符串。

最简单的方法是什么?

【问题讨论】:

    标签: java jar return executable-jar


    【解决方案1】:

    你知道什么是真正可怕的,当一个想法第一次奏效时......你会想知道你做错了什么......

    基本思想是执行一个新的 JVM 并读取该进程的输出。为此,您可以使用ProcessBuilder 并直接执行java

    此示例需要java 在执行路径中才能工作。此外,试图运行的 Jar 位于 dist 目录中,您可能需要更改它;)

    执行者

    这将启动 Java,执行所需的 Jar 文件并读取响应。

    public class RunJava {
    
        public static void main(String[] args) {
            ProcessBuilder pb = new ProcessBuilder("java", "-jar", "dist/RunJava.jar");
            pb.redirectErrorStream();
            try {
                Process p = pb.start();
                InputStreamReader isr = new InputStreamReader(p.getInputStream());
                p.waitFor();
                isr.join();
    
                System.out.println("Process said [" + isr.getText() + "]");
            } catch (Exception exp) {
                exp.printStackTrace();
            }
        }
    
        public static class InputStreamReader extends Thread {
    
            private InputStream is;
            private String text;
    
            public InputStreamReader(InputStream is) {
                this.is = is;
                start();
            }
    
            public String getText() {
                return text;
            }
    
            @Override
            public void run() {
                StringBuilder sb = new StringBuilder(64);
                int value = -1;
                try {
                    while ((value = is.read()) != -1) {
                        sb.append((char)value);
                    }
                } catch (IOException exp) {
                    exp.printStackTrace();
                    sb.append(exp.getMessage());
                }
                text = sb.toString();
            }
    
        }
    
    }
    

    主要

    已执行的“主”类(以及我们正在读取的结果......)

    public class Main {
    
        public static void main(String[] args) {
            System.out.println("Hello from the other side!");
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      您可以将 jar 添加到您的项目中,然后调用返回您要查找的内容的方法。通过这种方式,您将 jar 视为另一个您看不到其实现的类。

      请记住,这不会捕获写入控制台的文本。

      【讨论】:

      • 这是个好主意,但是我需要将它与项目完全分开,因为外部源可能会创建一个没有源的 jar,并且需要我正在编写的这个程序。
      猜你喜欢
      • 2010-11-22
      • 1970-01-01
      • 2016-03-01
      • 2010-10-10
      • 2016-09-04
      • 1970-01-01
      • 2011-01-15
      • 1970-01-01
      • 2014-06-10
      相关资源
      最近更新 更多