一个代码值得1000字解释它:-)
package jasim;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class JSTest {
public static void main(String[] args) throws ScriptException {
ScriptEngine jse = new ScriptEngineManager().getEngineByExtension("js");
jse.eval("println(new jasim.JSTest().toString)");
}
@Override
public String toString() {
return "JSTest Object";
}
}
Run Code Online (Sandbox Code Playgroud)
此代码将失败,但以下情况除外:
Exception in thread "main" javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: ReferenceError: "jasim" is not defined. (<Unknown source>#1) in <Unknown source> at line number 1
Run Code Online (Sandbox Code Playgroud)
如何将自己的类导入ScriptEngine?
我有一个使用ScriptEngine来处理一些javascript的项目,并且在我的机器上运行良好,但是当我将项目的jar发送到服务器时,我发现服务器的JVM没有内置的Rhino,当返回null时返回null代码调用了一个
new ScriptEngineManager().getEngineByName("javascript");
Run Code Online (Sandbox Code Playgroud)
我去了rhino的下载页面,获取了最新的版本,并从中提取了js.jar,在项目中添加了jar,但仍然有同样的问题.
我正在使用内置Apache Sling的内容存储库(Adobe CQ5).我想使用FreeMarker而不是JSP来呈现网页.
为了实现这一点,我应该将OSGi Freemarker扩展上传到Sling,这可以在Sling源代码的贡献部分找到,或者我应该上传一个OSGi版本的Freemarker吗?两个jar都实现了接口javax.script.ScriptEngineFactory,所以我不知道要使用哪个,或者上传两者.
我尝试从Java类调用我自己的groovy脚本函数,用户也可以使用标准表达式.
例如:
GroovyShell shell = new GroovyShell();
Script scrpt = shell.parse("C:/Users/Cagri/Desktop/MyCustomScript.groovy");
Binding binding = new Binding();
binding.setVariable("str1", "foo");
binding.setVariable("str2", "boo");
scrpt.setBinding(binding);
System.out.println(scrpt.evaluate("customConcat(str1, str2)")); //my custom method
System.out.println(scrpt.evaluate("str1.concat(str2)"));
Run Code Online (Sandbox Code Playgroud)
这是MyCustomScript.groovy
def area(def sf) {
Feature f = new Feature(sf);
f.getGeom().area;
}
def customConcat(def string1, def string2) {
string1.concat(string2)
}
Run Code Online (Sandbox Code Playgroud)
运行时,此行scrpt.evaluate("str1.concat(str2)")按预期工作,但scrpt.evaluate("customConcat(str1, str2)")会引发异常:
groovy.lang.MissingMethodException: No signature of method: Script1.customConcat() is applicable for argument types: (java.lang.String, java.lang.String) values: [foo, boo]
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:55)
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:78)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:49)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:133)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:145)
at …Run Code Online (Sandbox Code Playgroud) 我有一个在Chrome中工作得很好但在Nashorn崩溃的脚本:
(错误:名称空间"com.cognitect.transit.util"已在第6栏第19664行声明.
该错误不是很有用,因为该行包含:
throw Error('Namespace "' + name + '" already declared.');
Run Code Online (Sandbox Code Playgroud)
我需要从Nashorn获得一个完整的堆栈跟踪,我发现NashornException.getScriptStackString但是Nashorn生成的错误是javax.script.ScriptException在我调用时给出一个空字符串的类型NashornException.getScriptStackString.
如何从Nashorn获取JavaScript堆栈跟踪?
我不想从JavaScript中做到这一点,无论你运行什么JS代码,我都希望以与浏览器相同的方式实现它.很多我的JS代码都是第三方,它是生成的,我无法修改我必须打印异常的数千个函数以防万一.
我的代码看起来像这样:
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("JavaScript");
int x = 10;
engine.eval("x =" + x);
System.out.println((Boolean) engine.eval("x < 5"));
System.out.println((Boolean) engine.eval("2 < x < 5"));
Run Code Online (Sandbox Code Playgroud)
第一个SOP按预期打印错误,但第二个SOP打印为true.当我将变量与两个值进行比较时,它不会给出正确的结果.它给出了真实,即使条件的一半是真的.有什么解决方法吗?请建议.谢谢.
我一直在使用PEG.js版本0.6.1使用Maven插件(即从Java代码调用PEG.js)构建解析器,但是现在在尝试升级到新版本时,它失败并显示错误消息:
sun.org.mozilla.javascript.internal.EcmaError: SyntaxError: missing ; before statement (#3213(eval)#1) in #3213(eval) at line number 1
调试时我注意到PEG.buildParser()函数调用出来的解析器看起来语法错误,当然从浏览器调用它时不会发生.
这是我如何称呼它:
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine jsEngine = manager.getEngineByName("JavaScript");
jsEngine.eval(new InputStreamReader(this.getClass().getResourceAsStream(PEGJS_LIB)));
Invocable invok = (Invocable) jsEngine;
Object peg = jsEngine.get("PEG");
invok.invokeMethod(peg, "buildParser", grammarSource);
Run Code Online (Sandbox Code Playgroud)
其中,grammarSource在我的测试情况下,是作为基本语法的网站例如,和PEGJS_LIB = peg-0.7.0.js.
欢迎任何想法!我在这里用完了......
我在jar文件中有一个API但是如何在JavaScript中使用jar中的类?当我尝试导入它们时,
conf = Packages.abcapi.Config;
var cfg = new conf.Config();
Run Code Online (Sandbox Code Playgroud)
它不起作用.这不会在浏览器或互联网上使用.
更新:
我正在使用Java ScriptEngine将API扩展到所有JSR-223脚本语言.在Java应用程序内部,我读取了一个JavaScript文件,然后使用ScriptEngine执行该文件.我需要JavaScript文件来使用API中的类,它们位于一个jar文件中.我在运行ScriptEngine时尝试在类路径中设置jar,但它仍然没有使用上面的代码找到类.这在Jython中运行良好,因为在类路径中设置jar后,在Jython中使用jar文件中的类没有问题.
我正在使用带有 CQ5 的速度模板。我安装的速度脚本引擎可以识别预定义的 CQ 对象。我想知道如何将用户定义的java对象传递给速度脚本引擎。我尝试了类似的东西: http ://groovy.codehaus.org/JSR+223+Scripting+with+Groovy
但它不起作用..请帮我解决这个情况
提前致谢
我有一个Foo只有一个静态方法(注意)的类,叫做bar().我需要bar()通过运行时脚本(在这种情况下是Javascript)访问.
final ScriptEngineManager factory;
factory = new ScriptEngineManager();
factory.put("foo", new Foo());
Run Code Online (Sandbox Code Playgroud)
以上作品,但对我来说似乎有点奇怪.具体来说,我不想创建一个新的Foo.Foo是公共的,所以必须有一种方法让脚本工厂知道它,而不需要实例化一个新对象.我试过factory.put("foo", Foo.class);但是没用.我也尝试在Javascript代码中指定包,例如.
package.Foo.bar();
Run Code Online (Sandbox Code Playgroud)
但那也不起作用.
问:有没有办法从嵌入式脚本访问类的静态方法,而不将该类的实例绑定到引擎?
scriptengine ×10
java ×6
javascript ×4
aem ×2
nashorn ×2
rhino ×2
sling ×2
freemarker ×1
groovy ×1
groovyshell ×1
jar ×1
pegjs ×1
velocity ×1