0

アプリケーションのユーザーが提供する Java ファイルを実行時に実行したいと考えています。

私は試した:

Process p1 = Runtime.getRuntime().exec("javac MyClass.java");
p1.waitFor();
Process p2 = Runtime.getRuntime().exec("java MyClass");
p2.waitFor();

しかし、うまくいきません。クラス ファイルは作成されますが、バイナリ ファイルは作成されません。

なにか提案を?

私がやっていることを正確に説明します:

だからここに私のJavaファイルがあります:

public class MyClass {
    public void myMethod(){
        System.out.println("My Method Called");
    }
}

そして、このクラスをコンパイルして実行しようとしている私のコードは次のとおりです。

 public class TestExecute {

    private static void printLines(String name, InputStream ins) throws Exception {
        String line = null;
        BufferedReader in = new BufferedReader(
            new InputStreamReader(ins));
        while ((line = in.readLine()) != null) {
            System.out.println(name + " " + line);
        }
      }

      private static void runProcess(String command) throws Exception {
        Process pro = Runtime.getRuntime().exec(command);
        printLines(command + " stdout:", pro.getInputStream());
        printLines(command + " stderr:", pro.getErrorStream());
        pro.waitFor();
        System.out.println(command + " exitValue() " + pro.exitValue());
      }

      public static void main(String[] args) {
        try {
          runProcess("javac MyClass.java");
          runProcess("java MyClass");
        } catch (Exception e) {
          e.printStackTrace();
        }
      }

}

パスに MyClass.class が作成されます。Hier はコンソールの出力です。

javac C:/Users/Maher/workspace/1/src/main/java/model/MyClass.java exitValue() 0

Windows 7でEclipseを使用しています。

そして、このソリューションをテストするために「My Method Called」を表示したいのですが、表示されませんでした。

何か助けはありますか?ありがとう!

4

2 に答える 2

1

コンパイル済みまたは実行中の Java クラスの出力が必要な場合はInputStream、子プロセスの を読み取る必要があります。

 Process p2 = Runtime.getRuntime().exec("java MyClass");
 BufferedReader br=new BufferedReader(new InputStreamReader(p2.getInputStream()));

 String line=null;
 while( (line=br.readLine())!=null)
  {
    System.out.println(line);
  }
 p2.waitFor();

編集: メソッドを追加しmain()ます。

public class MyClass {
    public void myMethod(){
        System.out.println("My Method Called");
    }
    public static void main(String[] args){ 
       new MyClass().myMethod();
    } 
}
于 2012-07-04T13:24:23.947 に答える
0

別のアプローチを検討できます。Java には、JavaScript や Python などを埋め込むためのスクリプト API があります。さて、BeanShellは Java です。

exec を 2 回使用するよりも高速で脆弱性が低くなります。

于 2012-07-04T13:45:08.083 に答える