【问题标题】:How to run a java application with jshell?如何使用 jshell 运行 java 应用程序?
【发布时间】:2018-03-03 16:58:11
【问题描述】:

如何使用 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 编译 java 的方法吗?
  • 我只是在寻找一种从 jshell 调用普通“命令”的方法,例如 javals 等。
  • 如果你想用 jshell 构建 java 项目,有一个用于 gradle 的 jshell 插件。

标签: java java-9 jshell


【解决方案1】:

您的代码已损坏,因为您首先等待命令完成,然后才读取管道。如果命令产生的输出多于管道可以缓冲的输出,则该命令将被阻塞并且永远不会完成,因为此时没有人在读取管道。

在一个完美的世界里,你只需要使用

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")

【讨论】:

  • 在 MacOS 上也能正常工作。 (Y)
【解决方案2】:

为了在 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")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    相关资源
    最近更新 更多