标签: rhino

在ant脚本中使用最近的Rhino

我试图在ant标签中使用最新版本的Rhino,但它似乎使用的是与JVM捆绑在一起的Rhino版本.我已经尝试调整类路径来指定Rhino脚本jar.目前,我尝试过以下方法:

<project default="hello" name="hello-world" basedir=".">

    <target name="hello">

        <script language="javascript">

        <classpath>

            <pathelement location="js.jar"/>

        </classpath><![CDATA[

            x=<hello><world/></hello>

        ]]></script>    
    </target>

</project>
Run Code Online (Sandbox Code Playgroud)

请注意在脚本中包含E4X语法,该语法仅适用于Mozilla的Rhino,而不适用于与JVM捆绑的Rhino.

js.jar与ant脚本位于同一目录中.我也尝试将其重命名为rhino.jar,因为我认为我已经看到文档表明这是必要的.

当我运行它时,它会给出以下错误:

javax.script.ScriptException:sun.org.mozilla.javascript.EvaluatorException:语法错误(#3)

因此,它似乎仍然使用JVM附带的Rhino版本.如何让它使用新版本?

ant rhino

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

使用Rhino和JSR-223读取JSON文件

我正在尝试使用一些JavaScript来读取JSON文件,我正在通过Java JSR-223 API与Rhino一起评估.我正在尝试使用Rhino shell,但不能使用我的Java代码中的嵌入式Javascript.

这是有效的:

$ java -jar js.jar
js> readFile('foo.json');
{y:"abc"}
Run Code Online (Sandbox Code Playgroud)

这是不起作用的:

ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("js");
engine.eval("readFile('foo.json')"); 
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

Exception in thread "main" javax.script.ScriptException: 
sun.org.mozilla.javascript.internal.EcmaError: ReferenceError: "readFile" is not defined. (<Unknown source>#4) in <Unknown source> at line number 4
    at com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:153)
    at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:232)
Run Code Online (Sandbox Code Playgroud)

我怎样才能readFile在我的引擎中使用它?

javascript rhino jsr223

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

在Rhino eval期间包含JavaScript文件

如何在由Java运行的Rhino Engine评估的另一个脚本"Foo"中包含一个脚本"Bar".

IE,在Java中设置这样的脚本引擎:

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("javascript");
BufferedReader br = new BufferedReader(new FileReader(new File("Foo.js")));
engine.eval(br);
Run Code Online (Sandbox Code Playgroud)

......并将以下内容放入Foo:

load(["Bar.js"])
Run Code Online (Sandbox Code Playgroud)

根据Rhino shell文档,这是实现它的方法.但是从Java运行时,它显然没有实现:

javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: ReferenceError: "load" is not defined.
Run Code Online (Sandbox Code Playgroud)

@Phillip:

感谢您的创意回应.您的解决方案不太有效,因为除非使用Invocable接口,否则eval不会使解析的函数可用.此外,它在Java代码不可访问的情况下不起作用.我详细阐述了你的解决方法并创建了一些适用于纯JS的东西:

首先创建一个引擎,公开Invocable接口:

var engine = new Packages.javax.script.ScriptEngineManager().getEngineByName("javascript");
engine = Packages.javax.script.Invocable(engine);
Run Code Online (Sandbox Code Playgroud)

然后"加载()"脚本

engine.eval(new java.io.FileReader('./function.js'));
Run Code Online (Sandbox Code Playgroud)

此时,可以使用以下方法评估函数:

engine.invokeFunction("printHello", null);
Run Code Online (Sandbox Code Playgroud)

javascript rhino

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

递归方法比交互方法慢 10 倍

尽可能清理代码以显示我的问题。基本上它是一个八叉树搜索+相交。intersect 函数来自一个 SDK(整个项目是一个犀牛插件)。如果我使用交叉调用进行循环,它比通过八叉树进行递归搜索快 10 倍。甚至更奇怪 - 我隔离了相交调用的时间 - 在递归内部它比循环慢 8 倍。它的行为可能有 1000 个原因,但我希望我犯了一些明显的错误,有人可以通过查看代码发现。

有一个缓慢的递归部分:

public void NewRayCast()
{            
    int runs = 500000;                          //how many rays we cast
    Point3d raypos = new Point3d(0, 0, 0);      //raystart
    Ray3d ray = new Ray3d();                

    Random r = new Random();                    //here we create targets to scatter the ray directions
    Vector3d[] targets = new Vector3d[runs];
    for (int i = 0; i < runs; i++)
    {
        targets[i] = new Vector3d(r.NextDouble() * 200 - 100, 500, r.NextDouble() * …
Run Code Online (Sandbox Code Playgroud)

c# recursion rhino

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

犀牛安卓版

我正在尝试在我的 android 项目中使用rhino。我黎明加载了 Rhino 并添加js.jarlib.
\n这是我的MainActivity

\n\n
public class MainActivity extends AppCompatActivity {\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        ...\n\n        Context rhino = Context.enter();\n//        try{                     // I commented it to catch the error\n            rhino.setLanguageVersion(Context.VERSION_1_2);\n            Scriptable scope = rhino.initStandardObjects();\n            Object result=rhino.evaluateString(scope, \n                           "obj={a:1,b:[\'x\',\'y\']}", "MySource", 1, \n                            null);       // This line cannot be compiled\n\n            Scriptable obj = (Scriptable)scope.get("obj",scope);\n            Log.i("JS","obj " + (obj == result ? "==" : "!=") +" result");\n\n            Log.i("js","obj.a == " + …
Run Code Online (Sandbox Code Playgroud)

android rhino

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

JavaScript 会编译为二进制吗?

JavaScript 是否在网络浏览器之上运行?

喜欢运行在 JVM 之上的 Java 吗?

或者它实际上编译成二进制代码并在机器上运行吗?

javascript interpreter v8 rhino

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

在Java中调用(Rhino)JS函数并传入变量

昨天弄清楚如何配置我的Eclipse项目以便能够运行JS代码(如果你感兴趣:在Java内部为Google AppEngine构建一个JS服务器),我有下一个与此主题相关的问题:我有一个JS文件和其中的一个功能.我需要在我的Java代码中运行该函数并在其中传递(Java字符串)变量.我的文件非常基本,目前看起来像这样:

public class Com_feedic_readabilityServlet extends HttpServlet {
 public void doGet(HttpServletRequest req, HttpServletResponse resp)
   throws IOException {
  resp.setContentType("text/html"); 
  Context cx = ContextFactory.getGlobal().enterContext();
  cx.setOptimizationLevel(-1);
  cx.setLanguageVersion(Context.VERSION_1_5);
  Global global = Main.getGlobal();
  global.init(cx);
  Main.processSource(cx, "server_js/js_init.js");
 }
}
Run Code Online (Sandbox Code Playgroud)

我现在需要做的是调用该函数run()的内js_init.js-file.我该如何管理?

javascript java rhino

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

如何使用传递给Rhino javascript引擎的ArrayList java对象?

以下数据:

sku=[111222]
Run Code Online (Sandbox Code Playgroud)

正在作为参数传递给在Rhino javascript引擎中调用的javascript函数.

在java端(数据源自此处)这意味着"sku"的String键被映射到其中包含一个字符串"111222"的ArrayList.

一旦这转到了Rhino方面,我不知道如何将其用作javascript对象.例如:我如何做一些简单的事情就像在JS端获取111222值一样简单?

我决定吐出这个对象的键/值转储在JS方面的样子,这就是我得到的:

sku=

empty: false

indexOf: function indexOf() {/*
int indexOf(java.lang.Object)
*/}

notifyAll: function notifyAll() {/*
void notifyAll()
*/}

removeAll: function removeAll() {/*
boolean removeAll(java.util.Collection)
*/}

trimToSize: function trimToSize() {/*
void trimToSize()
*/}

containsAll: function containsAll() {/*
boolean containsAll(java.util.Collection)
*/}

contains: function contains() {/*
boolean contains(java.lang.Object)
*/}

equals: function equals() {/*
boolean equals(java.lang.Object)
*/}

notify: function notify() {/*
void notify()
*/}

subList: function subList() {/*
java.util.List subList(int,int)
*/}

class: class java.util.ArrayList
set: function set() {/* …
Run Code Online (Sandbox Code Playgroud)

javascript rhino

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

ArrayList <Integer>上的indexOf函数在JSR 223(Rhino脚本引擎)中不起作用

我尝试使用整数数组列表并检查var中是否存在.它适用于字符串数组但不适用于整数数组.

   public static void main(String[] args) throws ScriptException {
    List<Object> list = new ArrayList<Object>();
    list.add(1);
    list.add(2);

    List<String> lists = new ArrayList<String>();
    lists.add("1");
    lists.add("2");

    ScriptEngineManager factory = new ScriptEngineManager();
    ScriptEngine engine = factory.getEngineByName("JavaScript");
    engine.put("list", list);
    System.out.println(engine.eval("list.indexOf(1)"));
    //print -1 , Why ?

    engine.put("lists", lists);
    System.out.println(engine.eval("lists.indexOf('1')"));
    //print 0
}
Run Code Online (Sandbox Code Playgroud)

代码有什么问题?

java arrays rhino jsr223

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

从轻松的javascript使用功能调用OSGi服务

我试图从一个轻松的JavaScript使用功能访问OSGi服务.通过吊索SlingScriptHelper.我可以sling.getService(Service.class)从javascript 调用该方法,但我不知道如何在javascript中指定类.

看起来应该可以使用完全限定名称或使用rhino来引用java类importPackage(..).

但是,我得到以下异常:

org.apache.sling.scripting.sightly.SightlyException:
org.mozilla.javascript.EvaluatorException: Can't find method
org.apache.sling.scripting.core.impl.InternalScriptHelper.getService(object).
Run Code Online (Sandbox Code Playgroud)

rhino aem sightly

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

标签 统计

rhino ×10

javascript ×5

java ×2

jsr223 ×2

aem ×1

android ×1

ant ×1

arrays ×1

c# ×1

interpreter ×1

recursion ×1

sightly ×1

v8 ×1