一个nashorn引擎错误?

时间:2015-05-31 05:01:06

标签: java javascript java-8 nashorn

我尝试执行这个简单的短脚本来测试nashorn:

basedir="/cassandara2/cassandra"
ba="/cassandara2/cassandra/lib/ST4-4.0.8.jar";
lib = "";
lib += '      <root url="jar://' + ba.replace(basedir, "$PROJECT_DIR");
print(lib);

它完美无缺,但是当我在“$ PROJECT_DIR” ==&gt;之后添加 $ 符号时“$ PROJECT_DIR $”,我收到了这个错误:

> java.lang.StringIndexOutOfBoundsException: String index out of range:
> 13    at java.lang.String.charAt(String.java:646)     at
> jdk.nashorn.internal.objects.NativeRegExp.appendReplacement(NativeRegExp.java:738)
>   at
> jdk.nashorn.internal.objects.NativeRegExp.replace(NativeRegExp.java:674)
>   at
> 
> jdk.nashorn.internal.objects.NativeString.replace(NativeString.java:763)
> bla...

这个代码是jdk 8 nashorn(我使用的是jdk8 u45)的错误:

public static void main(String[] args) {
        try {
            ScriptEngineManager factory = new ScriptEngineManager();
            ScriptEngine engine = factory.getEngineByName("nashorn");

            Object eval = engine.eval("load(\"" + "script/demo.js" + "\");");
            System.out.println(eval);

        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

4 个答案:

答案 0 :(得分:2)

这不是答案,我没有足够的分数,但你有正则表达式异常而且$字符是regexp特殊字符。试着逃避它,例如'\\\$'

答案 1 :(得分:1)

我刚用2种不同的JVM版本(jdk SE 1.8.0_60-ea-b16和jdk SE 1.8.0_45-b14)对它进行了测试,它在PROJECT_DIR之前和之后完美地输出了两个$符号。

您能否提供一些更多细节,例如JDK实现,OS,32/64位JDK

您必须遇到一些潜在的问题,但作为修复,您可以尝试以下

替换这个JS系列:

lib += '      <root url="jar://' + ba.replace(basedir, "$PROJECT_DIR$");

使用这些转义序列之一

lib += '      <root url="jar://' + ba.replace(basedir, "\$PROJECT_DIR\$");
//or
lib += '      <root url="jar://' + ba.replace(basedir, "$$PROJECT_DIR$$");

答案 2 :(得分:1)

提交了Bug。替换字符串末尾的https://bugs.openjdk.java.net/browse/JDK-8081608 $导致索引超出范围错误

js> "string".replace("i", "$");
java.lang.StringIndexOutOfBoundsException: String index out of range: 1
jjs> "string".replace("i", "$ ");
str$ ng

答案 3 :(得分:1)

这是原始JDK 1.8.0版本中的a bug。它已在8u20更新版本中修复。

您报告在Java 8u45中看到此错误很奇怪,因为该版本肯定包含修复程序:

jdk1.8.0_45/bin/jjs
jjs> "string".replace("i", "$");
str$ng

您的路径上是否有较旧的JDK 8版本?