nashorn 引擎错误?
a nashorn engine bug?
我尝试执行这个简单的短脚本来测试 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" ==> [=19= 之后添加符号 $ ]"$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();
}
}
这不是答案,我没有足够的分数,但是你有正则表达式异常并且 $
字符是正则表达式特殊字符。尝试逃避它,例如'\$'
.
我刚刚用 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$$");
已提交错误。 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
这是原始 JDK 1.8.0 版本中的 a bug。它已在 8u20 更新版本中修复。
很奇怪你报告在 Java 8u45 上看到这个错误,因为那个版本肯定包含修复:
jdk1.8.0_45/bin/jjs
jjs> "string".replace("i", "$");
str$ng
您的道路上是否有较旧的 JDK 8 版本?
我尝试执行这个简单的短脚本来测试 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" ==> [=19= 之后添加符号 $ ]"$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();
}
}
这不是答案,我没有足够的分数,但是你有正则表达式异常并且 $
字符是正则表达式特殊字符。尝试逃避它,例如'\$'
.
我刚刚用 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$$");
已提交错误。 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
这是原始 JDK 1.8.0 版本中的 a bug。它已在 8u20 更新版本中修复。
很奇怪你报告在 Java 8u45 上看到这个错误,因为那个版本肯定包含修复:
jdk1.8.0_45/bin/jjs
jjs> "string".replace("i", "$");
str$ng
您的道路上是否有较旧的 JDK 8 版本?