运行 使用 Shebang 的 nashorn 不接受 -cp 选项
running nashorn using Shebang does not accept -cp option
我正在尝试使用带 -cp 选项的 Nashorn Shebang 脚本(java 版本“1.8.0_31”)将 class 用于 jar。但是它不起作用。我已经进行了一些测试。以下 shebang 行有效:
- #!/usr/bin/jjs-脚本
- #!/usr/bin/jjs -fv (returns nashorn 完整版 1.8.0_31-b13)
而以下不是:
- #!/usr/bin/jjs -cp ./some/lib/lib.jar 将 return 出现以下错误消息:"-cp ./some/lib/lib.jar"不是公认的选项。
- #!/usr/bin/jjs -scripting -fv 将 return 错误消息:"-scripting -fv" 不是可识别的选项。使用“-h”或“-help” 查看所有支持选项的列表
所有选项理论上都有效。 classpath 选项也应该像在 http://www.adam-bien.com/roller/abien/entry/setting_the_classpath_for_nashorn 上看到的那样工作。
有关 nashorn 和 Shebang 的更多信息:http://docs.oracle.com/javase/8/docs/technotes/guides/scripting/nashorn/shell.html#CHDEGHJJ
您 运行 遇到了一个与 Nashorn 和 Java 无关的问题。根据 this answer,shebang 的命令行参数处理从未明确指定,将第一个 white-space 之后遇到的所有内容都视为一个单独的参数似乎是一种常见的行为。
因此,一种解决方案是编写一个 shell 脚本,其中包含对 jjs
的调用以及实际参数,并使用该 shell 脚本作为您的 shebang 行中的解释器Nashorn 脚本。
您似乎想要一种自动将 JAR 添加到类路径的方法,我将突出显示我编写的一个小包装器,它允许您定义要添加到脚本的类路径,因此您可以使用“#dep”行编写脚本:
#!/usr/bin/env jjs-with-deps
#
# The line below is parsed by the jjs-with-deps script to build a new
# classloader in which the script is really executed, including logback
# and its transitive dependencies.
#
# dep:ch.qos.logback:logback-classic:1.1.2
var log = org.slf4j.LoggerFactory.getLogger("com.example.app.Logger");
log.info("Hello World!");
它确实需要将 Maven 安装在您的 PATH 中的某处,并且它确实会略微增加启动时间(但话又说回来,您已经在启动 JVM 了;)。当任何依赖项下载到本地 M2 存储库时,给定脚本的首次调用会慢得多。
您可以在 shebang 脚本中使用 -Dnashorn.args=-cp。另见 https://bugs.openjdk.java.net/browse/JDK-8072138
我正在尝试使用带 -cp 选项的 Nashorn Shebang 脚本(java 版本“1.8.0_31”)将 class 用于 jar。但是它不起作用。我已经进行了一些测试。以下 shebang 行有效:
- #!/usr/bin/jjs-脚本
- #!/usr/bin/jjs -fv (returns nashorn 完整版 1.8.0_31-b13)
而以下不是:
- #!/usr/bin/jjs -cp ./some/lib/lib.jar 将 return 出现以下错误消息:"-cp ./some/lib/lib.jar"不是公认的选项。
- #!/usr/bin/jjs -scripting -fv 将 return 错误消息:"-scripting -fv" 不是可识别的选项。使用“-h”或“-help” 查看所有支持选项的列表
所有选项理论上都有效。 classpath 选项也应该像在 http://www.adam-bien.com/roller/abien/entry/setting_the_classpath_for_nashorn 上看到的那样工作。 有关 nashorn 和 Shebang 的更多信息:http://docs.oracle.com/javase/8/docs/technotes/guides/scripting/nashorn/shell.html#CHDEGHJJ
您 运行 遇到了一个与 Nashorn 和 Java 无关的问题。根据 this answer,shebang 的命令行参数处理从未明确指定,将第一个 white-space 之后遇到的所有内容都视为一个单独的参数似乎是一种常见的行为。
因此,一种解决方案是编写一个 shell 脚本,其中包含对 jjs
的调用以及实际参数,并使用该 shell 脚本作为您的 shebang 行中的解释器Nashorn 脚本。
您似乎想要一种自动将 JAR 添加到类路径的方法,我将突出显示我编写的一个小包装器,它允许您定义要添加到脚本的类路径,因此您可以使用“#dep”行编写脚本:
#!/usr/bin/env jjs-with-deps
#
# The line below is parsed by the jjs-with-deps script to build a new
# classloader in which the script is really executed, including logback
# and its transitive dependencies.
#
# dep:ch.qos.logback:logback-classic:1.1.2
var log = org.slf4j.LoggerFactory.getLogger("com.example.app.Logger");
log.info("Hello World!");
它确实需要将 Maven 安装在您的 PATH 中的某处,并且它确实会略微增加启动时间(但话又说回来,您已经在启动 JVM 了;)。当任何依赖项下载到本地 M2 存储库时,给定脚本的首次调用会慢得多。
您可以在 shebang 脚本中使用 -Dnashorn.args=-cp。另见 https://bugs.openjdk.java.net/browse/JDK-8072138