运行 使用 Shebang 的 nashorn 不接受 -cp 选项

running nashorn using Shebang does not accept -cp option

我正在尝试使用带 -cp 选项的 Nashorn Shebang 脚本(java 版本“1.8.0_31”)将 class 用于 jar。但是它不起作用。我已经进行了一些测试。以下 shebang 行有效:

而以下不是:

所有选项理论上都有效。 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 存储库时,给定脚本的首次调用会慢得多。

Link 是 https://github.com/stevestorey/jjs-with-deps

您可以在 shebang 脚本中使用 -Dnashorn.args=-cp。另见 https://bugs.openjdk.java.net/browse/JDK-8072138