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

时间:2015-01-31 13:28:43

标签: java java-8 nashorn

我正在尝试使用带有-cp选项的Nashorn Shebang脚本(java版本“1.8.0_31”)将类用于jar。但它不起作用。我做了一些测试。以下shebang线工作:

  • #!/ usr / bin / jjs -scripting
  • #!/ usr / bin / jjs -fv(返回nashorn完整版1.8.0_31-b13)

而以下不是:

  • #!/ usr / bin / jjs -cp ./some/lib/lib.jar将返回以下错误消息:“ - cp ./some/lib/lib.jar”不是可识别的选项
  • #!/ usr / bin / jjs -scripting -fv将返回错误消息:“ - 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

3 个答案:

答案 0 :(得分:1)

你遇到了一个与Nashorn和Java没有任何关系的问题。根据{{​​3}},使用shebang处理的命令行参数从未被明确指定,并且将第一个空格后遇到的所有内容视为一个参数似乎是一种常见的行为。

因此,一个解决方案是编写一个包含jjs调用实际参数的shell脚本,并将该shell脚本用作Nashorn脚本的shebang行中的解释器。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

看起来你想要一种方法来自动将JAR添加到类路径中,我将突出显示我编写的一个小包装器,它允许你定义要添加的Maven坐标依赖项(包括传递)到脚本的类路径,所以你可以使用"#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存储库。

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