【问题标题】:How to run a JShell File?如何运行 JShell 文件?
【发布时间】:2020-11-30 10:06:23
【问题描述】:

我想用 JShell 运行整个文件,例如:

$ jshell my-jshell-skript.java

例如在哪里我的my-jshell-skript.java 的内容是40 + 2;

或者像这样的可执行文件:

#!/usr/bin/jshell
40 + 2

现在这可能吗,还是我仍然必须采用旧方法而不是 Java-Main-Class?

编辑 1:Windows 问题

在 Windows 上,我仍然没有解决方案:

C:\JDKs\jdk9.0.0.0_x64\bin>type foo.jsh
1 + 1

C:\JDKs\jdk9.0.0.0_x64\bin>jshell.exe foo.jsh
|  Welcome to JShell -- Version 9
|  For an introduction type: /help intro

jshell> /exit
|  Goodbye

C:\JDKs\jdk9.0.0.0_x64\bin>

JShell 开始完全忽略我的文件。是bug吗?

编辑 2:Windows 问题的解决方案

原来是我的 foo 的内容。似乎1 + 1 只能“即时”工作,而不是从文件中读取:

C:\JDKs\jdk9.0.0.0_x64\bin>type foo.jsh
System.out.println("foo");

C:\JDKs\jdk9.0.0.0_x64\bin>jshell.exe foo.jsh
foo
|  Welcome to JShell -- Version 9
|  For an introduction type: /help intro

jshell> /exit
|  Goodbye

C:\JDKs\jdk9.0.0.0_x64\bin>

【问题讨论】:

  • 伙计,这太烦人了。所有对 jshell 的炒作,它都无法运行 jshell helloworld.java

标签: java java-9 jshell


【解决方案1】:

您可以使用这些语句创建一个名为some.jshJshell script 文件,并在运行jshell 的命令提示符下执行它:-

jshell /path/to/some.jsh

在 MacOSX 上,我会这样做:

【讨论】:

  • 脚本完成后有没有办法禁止进入交互模式?
  • @pnewhook 您可以在脚本中使用/exit
【解决方案2】:

您可以将字符串通过管道传递给 JShell:

echo 1 + 2 | jshell

例子:

:/# echo 1 + 2 | jshell
|  Welcome to JShell -- Version 9
|  For an introduction type: /help intro

jshell> 1 + 2
$1 ==> 3

:/#

或者,从文件中:

cat myfile | jshell

其中myfile 包含“1 + 2”行。

【讨论】:

  • 这在 Cygwin 中不起作用:``` peter@AB4745 /cygdrive/c/JDKs/jdk9.0.0.0_x64/bin $ echo 2 + 3 | jshell.exe |欢迎使用 JShell -- 第 9 版 |对于介绍类型:/help intro jshell> ```
【解决方案3】:

JShell 并不意味着直接运行 Java 类。如果你想运行一个 java 类,你仍然需要用旧方法 - java <your-class-name>

来自docs

Java Shell 工具 (JShell) 是一个交互式工具,用于学习 Java 编程语言和原型 Java 代码。 JShell 是一个 读取-评估-打印循环 (REPL),它评估声明, 输入并立即显示的语句和表达式 结果。

根据此引用,JShell 用于运行或尝试单个 Java 语句。在传统的 java 方式中,您必须编写一个完整的 Java 程序,然后才能运行它并查看结果。但是 JShell 允许您尝试 Java 语句,而无需构建完整的独立 Java 应用程序。

所以对您的问题的简短回答是,不,您不能调用像 jshell my-jshell-skript.java 这样的独立 Java 应用程序。但是,您可以调用包含单个 JShell 命令或 Java 语句的脚本文件。因此,如果您从 Java 程序中复制所有语句并将它们粘贴到 JShell 脚本中,您可以像这样运行脚本:

% jshell my-jshell-skript.jsh

但这与运行独立的 java 应用程序并不完全相同。

【讨论】:

    【解决方案4】:

    concise反馈模式下启动jshell并过滤所需内容-

    $echo '40 + 2' | jshell --feedback concise | sed -n '2p' |sed -En 's/[^>]*>(.+)/\1/gp'
    

    输出: 42

    更多细节在这里-How to execute java jshell command as inline from shell or windows commandLine

    【讨论】:

      【解决方案5】:

      在 jshell 中,您可以通过发出以下命令将当前的 sn-ps 保存到文件中:

      /save Filename
      

      同样,您可以通过发出以下命令将文件加载到当前上下文/会话中:

      /open Filename
      

      这是一个这样的例子:

      |  Welcome to JShell -- Version 9.0.7.1
      |  For an introduction type: /help intro
      
      jshell> String[] names={"nameone","nametwo"}
      names ==> String[2] { "nameone", "nametwo" }
      
      jshell> Arrays.toString(names);
      $2 ==> "[nameone, nametwo]"
      
      jshell> /save myExample
      
      jshell> %                                                                                                                                             sudipbhandari at sysadm-Latitude-5480 in ~                                                                                                      18:22
      > jshell
      |  Welcome to JShell -- Version 9.0.7.1
      |  For an introduction type: /help intro
      
      jshell> names
      |  Error:
      |  cannot find symbol
      |    symbol:   variable names
      |  names
      |  ^---^
      
      jshell> /open myExample
      
      jshell> names
      names ==> String[2] { "nameone", "nametwo" }
      

      【讨论】:

        【解决方案6】:

        Windows 中,查看 jsh 文件的详细输出

        type file.jsh | jshell -v
        

        运行jshell file.jsh时出现问题

        D:\>type file.jsh
        3 + 5
        
        D:\>jshell file.jsh
        |  Welcome to JShell -- Version 13.0.2
        |  For an introduction type: /help intro
        
        jshell>
        

        解决方法:

        D:\>type file.jsh
        3 + 5
        
        D:\>type file.jsh | jshell -v
        |  Welcome to JShell -- Version 13.0.2
        |  For an introduction type: /help intro
        
        jshell> $1 ==> 8
        |  created scratch variable $1 : int
        
        jshell>
        

        注意:文件最后一行后应包含一个空行 (/n),否则最后一行不会被执行

        【讨论】:

          【解决方案7】:

          管道使用可以通过“连字符”选项来实现,在初始 jshell 版本中不存在。

          echo 'System.out.print(1 + 2)' | jshell -
          

          https://docs.oracle.com/en/java/javase/11/tools/jshell.html
          https://bugs.openjdk.java.net/browse/JDK-8187439

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-06-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-06-01
            相关资源
            最近更新 更多