我使用Java的ScriptEngine执行JavaScript代码。我使用Invocable接口,以便可以将脚本代码用作实现Java接口的普通Java对象。
如果JavaScript代码
我在执行代码时从Rhino或UndeclaredThrowableException获得内部异常。两者都是RuntimeException,不能“允许”捕获。
有没有一种方法可以在执行之前验证代码?还是我必须在这里打破规则并捕获RuntimeExceptions?那对我有用,但是最优雅的方法是什么?
我有6个js文件,我需要将它们全部包含在最终脚本中以传递ScriptEngine的eval方法.我怎么能这样做?ScriptEngine没有add()方法.我可以用FileReader读取它们,而不是连接这些字符串,但我认为会有更好的方法.
无论如何在没有node.js的情况下运行UglifyJS2?假设我想使用JavaScript脚本引擎在JVM进程中运行它.怎么做?
通过这个简单的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) 我试图获得__DIR__,__LINE__并且由JavaScript Nashorn Engine(JDK 8)编译和评估的JavaScript文件中的__FILE__ Nashorn全局变量.
但是,所有这些都返回NULL ...
它们与某些特定的Nashorn配置有关吗?它没有在文档中说任何有关使其工作的任何其他配置的内容.
我正在使用Java 8.我不是java专家(10年前从未上过java)
我创建了一个ScriptEngine实例(Nashorn,如果重要的话).我用它来评估几个javascript文件.
这个脚本在它自己的小javascript世界中非常开心.我喜欢它.
我还运行了一个File System WatchService,以防我的一些java脚本被修改.当它们被修改后,我创建一个新的ScriptEngine,并使用新的ScriptEngine对象评估新版本的javascript文件.
我的问题是,一旦我创建了新的scriptEngine,我就不能"杀死"旧脚本.旧脚本继续无限期运行.
我真的想释放旧scriptEngine对象使用的资源.我希望它停止做它所做的事情(因为它可能与新实例冲突,如果他们都尝试做同样的事情).
那么......我如何完全消除旧的ScriptEngine,包括它内部产生的任何线程?
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吗?
我试图在客户端使用PageDown作为编辑器,然后在服务器端将Markdown解析为HTML.
它似乎在客户端工作正常,但在服务器端,tickmarks只是"编纂"后面的字符,而不是它包装的单词.所以,如果我这样做:
test `test` test
我期待这一点,这确实是我在客户端获得的:
test <code>test</code> test
但在服务器端,我最终得到了这个:
test <code>t</code>est<code> </code>test
我创建了一个称为文件pageDown.js,这简直是Markdown.Converter.js和Markdown.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 ScriptEngineManager和Invocable:
import java.io.InputStreamReader;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
public class …Run Code Online (Sandbox Code Playgroud) 我的应用程序使用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 ScriptEngineManager并ScriptEngine使用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)提供者.
谢谢
scriptengine ×10
java ×9
javascript ×7
nashorn ×4
rhino ×2
apache-karaf ×1
applescript ×1
java-8 ×1
jvm ×1
markdown ×1
osgi ×1
pagedown ×1
scripting ×1
uglifyjs ×1
uglifyjs2 ×1