簡體   English   中英

如何使用jshell運行java應用程序?

[英]How to run a java application with jshell?

如何使用jshell運行java應用程序? 它應該能夠指定類路徑並調用java命令並傳遞一些參數,如bash,例如,

#!/bin/bash
$ARGS=...
$CLASSPATH=...
java -cp $CLASSPATH $ARGS com.example.MyApp

更新:
我認為運行時或進程的包裝是必需的,例如,

jshell> private String executeCommand(String command) {
   ...>
   ...>         StringBuffer output = new StringBuffer();
   ...>
   ...>         Process p;
   ...>         try {
   ...>             p = Runtime.getRuntime().exec(command);
   ...>             p.waitFor();
   ...>             BufferedReader reader =
   ...>                             new BufferedReader(new InputStreamReader(p.getInputStream()));
   ...>
   ...>                         String line = "";
   ...>             while ((line = reader.readLine())!= null) {
   ...>                 output.append(line + "\n");
   ...>             }
   ...>
   ...>         } catch (Exception e) {
   ...>             e.printStackTrace();
   ...>         }
   ...>
   ...>         return output.toString();
   ...>
   ...>     }
|  Created method executeCommand(String)

jshell> String out =executeCommand("java --version");
out ==> "java 9.0.4\nJava(TM) SE Runtime Environment (bui ... d 9.0.4+11, mixed mode)\n"

jshell> System.out.println(out);
java 9.0.4
Java(TM) SE Runtime Environment (build 9.0.4+11)
Java HotSpot(TM) 64-Bit Server VM (build 9.0.4+11, mixed mode)

對於在jshell中運行任何應用程序,首先在開始時將類路徑設置為jshell。

例:

jshell -class-path /Users/sree/Desktop/libs/jettison-1.0.1.jar 

然后將類導入到運行的環境中

import org.codehaus.jettison.json.JSONObject;

這會將所需的類導入到環境中。

現在運行所需的應用程序。 就我而言,我進入了

String myString = new JSONObject().put("JSON", "Hello, World!").toString()

並得到了輸出

myString ==> "{\"JSON\":\"Hello, World!\"}"

回答傳遞命令行參數的問題。 你必須用所有的值來啟動課程。

Test instance = new Test("data","data1")

您的代碼已損壞,因為您正在等待命令的完成,並且僅在讀取管道之后。 如果該命令產生的輸出多於管道可以緩沖的輸出,則該命令將被阻塞並且永遠不會完成,因為此時沒有人正在讀取管道。

在一個完美的世界中,你只會使用

new ProcessBuilder(your command and args).inheritIO().start().waitFor()

就像在普通的Java應用程序中一樣 不幸的是, jshell以一種不起作用的方式更改標准文件描述符(至少在我測試的Windows版本中)。

您可以使用

void run(String... arg) throws IOException, InterruptedException {
  Path tmp = Files.createTempFile("run", ".tmp");
  try {
    new ProcessBuilder(arg).redirectErrorStream(true).redirectOutput(tmp.toFile())
      .start().waitFor();
    Files.lines(tmp, java.nio.charset.Charset.defaultCharset())
      .forEach(System.out::println);
  }
  finally { Files.delete(tmp); }
}

並稱之為,例如

run("java", "-version")

要么

run("java", "-d", "java.base")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM