标签: scriptengine

导入我的类的Java Scripting Engine不起作用

一个代码值得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?

java scriptengine

4
推荐指数
1
解决办法
7201
查看次数

JVM缺少Rhino

我有一个使用ScriptEngine来处理一些javascript的项目,并且在我的机器上运行良好,但是当我将项目的jar发送到服务器时,我发现服务器的JVM没有内置的Rhino,当返回null时返回null代码调用了一个

new ScriptEngineManager().getEngineByName("javascript");
Run Code Online (Sandbox Code Playgroud)

我去了rhino的下载页面,获取了最新的版本,并从中提取了js.jar,在项目中添加了jar,但仍然有同样的问题.

java rhino scriptengine

4
推荐指数
1
解决办法
2673
查看次数

将FreeMarker与Apache Sling一起使用

我正在使用内置Apache Sling的内容存储库(Adobe CQ5).我想使用FreeMarker而不是JSP来呈现网页.

为了实现这一点,我应该将OSGi Freemarker扩展上传到Sling,这可以在Sling源代码的贡献部分找到,或者我应该上传一个OSGi版本的Freemarker吗?两个jar都实现了接口javax.script.ScriptEngineFactory,所以我不知道要使用哪个,或者上传两者.

freemarker scriptengine sling aem

3
推荐指数
1
解决办法
1181
查看次数

如何从Java评估我自己的Groovy脚本?

我尝试从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)

java groovy groovyshell scriptengine groovyclassloader

3
推荐指数
1
解决办法
6630
查看次数

你如何从Nashorn获得JavaScript堆栈跟踪?

我有一个在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代码都是第三方,它是生成的,我无法修改我必须打印异常的数千个函数以防万一.

javascript java scriptengine nashorn

3
推荐指数
1
解决办法
1946
查看次数

评估字符串时不正确的答案

我的代码看起来像这样:

    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.当我将变量与两个值进行比较时,它不会给出正确的结果.它给出了真实,即使条件的一半是真的.有什么解决方法吗?请建议.谢谢.

javascript java scriptengine

2
推荐指数
1
解决办法
144
查看次数

如何使用Rhino构建PEG.js 0.7.0解析器(Java SE 6 ScriptEngine API)

我一直在使用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.

欢迎任何想法!我在这里用完了......

javascript rhino parser-generator scriptengine pegjs

2
推荐指数
1
解决办法
404
查看次数

JavaScript可以使用jar文件中的类(非Internet使用)

我在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文件中的类没有问题.

javascript jar scriptengine

2
推荐指数
1
解决办法
8031
查看次数

将用户定义的java对象传递给velocity脚本引擎

我正在使用带有 CQ5 的速度模板。我安装的速度脚本引擎可以识别预定义的 CQ 对象。我想知道如何将用户定义的java对象传递给速度脚本引擎。我尝试了类似的东西: http ://groovy.codehaus.org/JSR+223+Scripting+with+Groovy

但它不起作用..请帮我解决这个情况

提前致谢

velocity scriptengine sling aem

0
推荐指数
1
解决办法
8300
查看次数

如何通过ScriptEngine访问仅限静态方法的类?

我有一个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)

但那也不起作用.

问:有没有办法从嵌入式脚本访问类的静态方法,而不将该类的实例绑定到引擎?

java scriptengine nashorn

0
推荐指数
1
解决办法
2341
查看次数