jre1.8.0_121中的Nashorn改变了传递参数的行为?

时间:2017-02-03 10:37:58

标签: java nashorn

在SLES11和RedHat7上安装jre1.8.0_121之后,当使用jjs从命令行运行时,nashorn引擎似乎会忽略-Dname = value选项,除非它以-J为前缀。

" - "当使用shebang时,参数分隔符被传递给javascript。

根据在线帮助,它应该像这样工作:

$ /usr/java/jre1.8.0_121/bin/jjs -h
jjs [<options>] <files> [-- <arguments>]
    -D (-Dname=value. Set a system property. This option can be repeated.)

在下面的例子中,我故意留下一个shebang! javascript中的标头。它不应该在那里,但是在u102和u121之间暴露了参数如何传递给args.js javascript的另一个区别。

在没有-J的情况下跟踪示例显示永远不会读取本地args.log.properties。而是使用默认的/usr/java/jre1.8.0_121/lib/logging.properties。如果我用我的自定义属性文件替换/usr/java/jre1.8.0_121/lib/logging.properties,一切都恢复正常。

这是u121中故意改变的行为吗?

args.sh:

#!/bin/bash -x
/usr/java/jre1.8.0_102/bin/jjs -scripting -Djava.util.logging.config.file=./args.log.properties ./args.js -- arg1 arg2 $*
/usr/java/jre1.8.0_121/bin/jjs -scripting -Djava.util.logging.config.file=./args.log.properties ./args.js -- arg1 arg2 $*

args.js:

#!/usr/bin/env jjs
print (arguments);
print ($ARG[0]);
var logger = java.util.logging.Logger;
var log = logger.getLogger("args");
log.info("log output");

args.log.properties:

handlers=java.util.logging.FileHandler, java.util.logging.ConsoleHandler
.level=ALL
java.util.logging.ConsoleHandler.level=ALL
java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format=%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS %4$s %3$s %5$s%6$s%n

当使用2个不同的JRE运行时,它会显示以下差异。自定义日志记录选项将被忽略,参数分隔符&#34; - &#34;作为第一个参数传递给javascipt。 :

$ ./args.sh arg3
+ /usr/java/jre1.8.0_102/bin/jjs -scripting -Djava.util.logging.config.file=./args.log.properties ./args.js -- arg1 arg2 arg3
arg1,arg2,arg3
arg1
2017-02-03 11:34:59 INFO args log output
+ /usr/java/jre1.8.0_121/bin/jjs -scripting -Djava.util.logging.config.file=./args.log.properties ./args.js -- arg1 arg2 arg3
--,arg1,arg2,arg3
--
Feb 03, 2017 11:35:00 AM jdk.nashorn.internal.scripts.Script$args :program
INFO: log output
$

添加&#34; -J&#34;在-D前面解决了系统属性问题,并与两个JRE一起使用。 shebang问题仍然存在:

$ ./args.sh arg3
+ /usr/java/jre1.8.0_102/bin/jjs -scripting -J-Djava.util.logging.config.file=./args.log.properties ./args.js -- arg1 arg2 arg3
arg1,arg2,arg3
arg1
2017-02-03 14:04:03 INFO args log output
+ /usr/java/jre1.8.0_121/bin/jjs -scripting -J-Djava.util.logging.config.file=./args.log.properties ./args.js -- arg1 arg2 arg3
--,arg1,arg2,arg3
--
2017-02-03 14:04:04 INFO args log output
$ 

1 个答案:

答案 0 :(得分:0)

我不知道这是否是故意的。但我可以确认我遇到了问题 - 被传递到我的脚本(确实有shebang)。目前,我添加了以下内容来解决该问题:

if ($ARG.length > 0 && $ARG[0] == "--") {
    $ARG.shift(); // because sometimes the come through!?!
}

以防后来的更改还原它。为清楚起见,我的脚本实际上始于:

#!/usr/bin/jjs -scripting

我想知道这个改变是否与答案有关: Writing a `jjs` shebanged script that accepts just arguments