标签: scriptengine

验证JavaScript代码

我使用Java的ScriptEngine执行JavaScript代码。我使用Invocable接口,以便可以将脚本代码用作实现Java接口的普通Java对象。

如果JavaScript代码

  • 是无效的
  • 不遵循界面(缺少方法,错误的返回类型,引发异常等)

我在执行代码时从Rhino或UndeclaredThrowableException获得内部异常。两者都是RuntimeException,不能“允许”捕获。

有没有一种方法可以在执行之前验证代码?还是我必须在这里打破规则并捕获RuntimeExceptions?那对我有用,但是最优雅的方法是什么?

javascript java rhino scriptengine

5
推荐指数
1
解决办法
4688
查看次数

如何让ScriptEngine运行多个javascript文件?

我有6个js文件,我需要将它们全部包含在最终脚本中以传递ScriptEngine的eval方法.我怎么能这样做?ScriptEngine没有add()方法.我可以用FileReader读取它们,而不是连接这些字符串,但我认为会有更好的方法.

javascript java scriptengine

5
推荐指数
1
解决办法
2294
查看次数

如何在没有Node.JS的情况下运行UglifyJS2

无论如何在没有node.js的情况下运行UglifyJS2?假设我想使用JavaScript脚本引擎在JVM进程中运行它.怎么做?

javascript jvm scriptengine uglifyjs uglifyjs2

5
推荐指数
1
解决办法
2633
查看次数

如何使用ScriptEngine从Javascript输出到Java

通过这个简单的AppleScript,我可以列出iTunes中所有歌曲的名称

tell application "iTunes"
    set mainLibrary to library playlist 1
    repeat with nexttrack in (get every track of mainLibrary)
        try
            name of nexttrack
        end try
    end repeat
end tell
Run Code Online (Sandbox Code Playgroud)

然后我使用ScriptEngine将其作为Java 7代码运行,但是很明显如何获取脚本的结果,在这种情况下只是最后一个轨道的名称.

    StringBuilder script =new StringBuilder();
    script.append("tell application \"iTunes\"\n");
    script.append("set mainLibrary to library playlist 1\n");
    script.append("repeat with nexttrack in (get every track of mainLibrary)\n");
    script.append("try\n");
    script.append("name of nexttrack\n");
    script.append("end try\n");
    script.append("end repeat\n");
    script.append("end tell\n");
    ScriptEngineManager mgr = new ScriptEngineManager();
    ScriptEngine engine = mgr.getEngineByName("AppleScript");
    System.out.println(engine.eval(script.toString()));

How do can I capture the name …
Run Code Online (Sandbox Code Playgroud)

java scripting applescript scriptengine

5
推荐指数
1
解决办法
2268
查看次数

为什么Java Nashorn __DIR __,_ _ _ 3和__FILE__为空?

我试图获得__DIR__,__LINE__并且由JavaScript Nashorn Engine(JDK 8)编译和评估的JavaScript文件中的__FILE__ Nashorn全局变量.

但是,所有这些都返回NULL ...

它们与某些特定的Nashorn配置有关吗?它没有在文档中说任何有关使其工作的任何其他配置的内容.

javascript java scriptengine java-8 nashorn

5
推荐指数
1
解决办法
954
查看次数

如何销毁Java ScriptEngine实例?

我正在使用Java 8.我不是java专家(10年前从未上过java)

我创建了一个ScriptEngine实例(Nashorn,如果重要的话).我用它来评估几个javascript文件.

这个脚本在它自己的小javascript世界中非常开心.我喜欢它.

我还运行了一个File System WatchService,以防我的一些java脚本被修改.当它们被修改后,我创建一个新的ScriptEngine,并使用新的ScriptEngine对象评估新版本的javascript文件.

我的问题是,一旦我创建了新的scriptEngine,我就不能"杀死"旧脚本.旧脚本继续无限期运行.

我真的想释放旧scriptEngine对象使用的资源.我希望它停止做它所做的事情(因为它可能与新实例冲突,如果他们都尝试做同样的事情).

那么......我如何完全消除旧的ScriptEngine,包括它内部产生的任何线程?

javascript java scriptengine nashorn

5
推荐指数
1
解决办法
832
查看次数

Java将选择哪个JS脚本引擎?

ScriptEngineManager.getEngineByName查找并为给定名称创建一个ScriptEngine。

Rhino将自己注册为“ js”,“ rhino”,“ JavaScript”,“ javascript”,“ ECMAScript”和“ ecmascript”

Nashorn将自己注册为“ nashorn”,“ Nashorn”,“ js”,“ JS”,“ JavaScript”,“ javascript”,“ ECMAScript”和“ ecmascript”

如果我使用Nashorn和Rhino均已注册的“ js”之类的名称,将使用哪个脚本引擎?它将在Java 8和Rhino上使用Nashorn吗?

java rhino scriptengine nashorn

5
推荐指数
1
解决办法
1180
查看次数

PageDown通过ScriptEngine错误地解析Markdown

我试图在客户端使用PageDown作为编辑器,然后在服务器端将Markdown解析为HTML.

它似乎在客户端工作正常,但在服务器端,tickmarks只是"编纂"后面的字符,而不是它包装的单词.所以,如果我这样做:

test `test` test

我期待这一点,这确实是我在客户端获得的:

test <code>test</code> test

但在服务器端,我最终得到了这个:

test <code>t</code>est<code> </code>test

我创建了一个称为文件pageDown.js,这简直是Markdown.Converter.jsMarkdown.Sanitizer.js合并成一个单一的文件,使用此功能补充说:

function getSanitizedHtml(pagedown){
    var converter =  new Markdown.getSanitizingConverter();
    return converter.makeHtml(pagedown);
}
Run Code Online (Sandbox Code Playgroud)

在客户端,我可以像这样使用这个文件:

<!DOCTYPE html>
<html>
<head>
<script src="pageDown.js"></script>
<script>
function convert(){

    var html = getSanitizedHtml("test `test` test");

    console.log(html);

    document.getElementById("content").innerHTML = html;
}

</script>
</head>

<body onload="convert()">
<p id="content"></p>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

这正确显示: <p>test <code>test</code> test</p>

在(Java)服务器端,我使用相同的文件,通过Java ScriptEngineManagerInvocable:

import java.io.InputStreamReader;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

public class …
Run Code Online (Sandbox Code Playgroud)

javascript java markdown scriptengine pagedown

5
推荐指数
1
解决办法
143
查看次数

ScriptEngine清除并处置

我的应用程序使用a ScriptEngine为我的最终用户提供插件功能.

ScriptEngineManager engineManager = new ScriptEngineManager();
ScriptEngine engine = engineManager.getEngineByName("nashorn");
Run Code Online (Sandbox Code Playgroud)

每当用户对其脚本进行更改时,应用程序都会通过新实例替换引擎实例.

String newScript = ...;
engine = engineManager.getEngineByName("nashorn");
engine.eval(newScript);
Run Code Online (Sandbox Code Playgroud)

两个密切相关的问题:

  • 我应该尝试重用引擎并对它们执行某种操作clear()吗?

  • 如果我只是用新实例替换我的引擎,我应该以某种方式处理前一个实例,以避免内存泄漏吗?(例如,我可以想象用户可以设法创建一个启动线程的脚本.)

问题是,我找不到任何看起来像a clear()或a的方法dispose().这是否意味着我目前的做法是正确的?

java scriptengine nashorn

5
推荐指数
2
解决办法
3623
查看次数

无法在Karaf OSGi中加载ScriptEngineManager和ScriptEngine(未找到Nashorn)

我正在尝试使用Java ScriptEngineManagerScriptEngine使用Java执行一些JavaScript代码.我使用Java 8我在Karaf OSGi下执行此代码.

我使用的示例在示例Java类中工作正常,但将其打包在一个包中会给我这个错误 ScriptEngineManager providers.next(): javax.script.ScriptEngineFactory: Provider jdk.nashorn.api.scripting.NashornScriptEngineFactory not found

当我查看bundle的头文件时,我看到bundle导入javax.script,了被调用类的包,但似乎找不到(nashorn)提供者.

谢谢

javascript java osgi scriptengine apache-karaf

5
推荐指数
1
解决办法
1344
查看次数