如何从Java/scala调用js美化程序
How to call jsbeautifier from Java/scala?
我想从Java代码中格式化一些json文件,我想使用著名的http://jsbeautifier.org图书馆
我遵循了这个问题:从java代码中调用外部javascript函数,但找不到正确的函数来调用。
我尝试了inv.invokeFunction("js_beautify", json)
,但它报告:
java.lang.NoSuchMethodException: no such method: js_beautify
我的代码(实际上是Scala,但只是使用Java API):
val manager = new ScriptEngineManager()
val engine = manager.getEngineByName("JavaScript")
// read script file
engine.eval(FileUtils.readFileToString(new File("beautify.js")))
val inv = engine.asInstanceOf[Invocable]
// call function from script file
inv.invokeFunction("js_beautify", json).asInstanceOf[String]
文件beautify.js
的结构为:
(function() {
// a lot of js code
// ...
if (typeof define === "function" && define.amd) {
// Add support for AMD ( https://github.com/amdjs/amdjs-api/wiki/AMD#defineamd-property- )
define([], function() {
return { js_beautify: js_beautify };
});
} else if (typeof exports !== "undefined") {
// Add support for CommonJS. Just put this file somewhere on your require.paths
// and you will be able to `var js_beautify = require("beautify").js_beautify`.
exports.js_beautify = js_beautify;
} else if (typeof window !== "undefined") {
// If we're running a web page and don't have either of the above, add our one global
window.js_beautify = js_beautify;
} else if (typeof global !== "undefined") {
// If we don't even have window, try global.
global.js_beautify = js_beautify;
}
}());
也许我需要从Java提供一些global
或window
上下文?
更新:
我关注了@tiblu的答案:中的"JSBeautify NetBeans插件"
class FormatJson {
def apply(json: String): String = {
val context = Context.enter()
context.setLanguageVersion(Context.VERSION_1_6)
val scope = context.initStandardObjects()
val reader = new FileReader(new File("beautify.js"))
context.evaluateReader(scope, reader, "Beautify", 1, null)
val fct = scope.get("js_beautify", scope).asInstanceOf[org.mozilla.javascript.Function]
fct.call(context, scope, scope, Array[AnyRef](json)).toString
}
}
但据报道:
Exception in thread "main" java.lang.ClassCastException: org.mozilla.javascript.UniqueTag cannot be cast to org.mozilla.javascript.Function
而scope.get("js_beautify", scope)
的值实际上就是NOT_FOUND
。
我正在使用"org.mozilla" % "rhino" % "1.7R5"
有什么问题吗?
看看JSBeautify NetBeans插件是如何做到这一点的,它是用Java编写的-https://github.com/drewhamlett/netbeans-jsbeautify/tree/master/src/com/drewhamlett/jsbeautify
相关文章:
- 如何在没有单词的情况下从命令行运行Node.js程序'节点'
- 从shell脚本中杀死Node.js程序
- Mongo无法使用node.js程序
- 在three.js程序中运行一个webgl函数
- 婴儿步骤 节点.js程序打印不确定的结果
- 如何在node.js内运行JS程序
- 如何使这个 Node.js 程序异步
- 第一个JS,向经验丰富的JS程序员寻求建议
- 如何记录node.js程序中的每一个“抛出”
- 为什么我的节点.js“程序终止”而没有错误
- 我如何通过方法写入数据 response.write 从 MySQL 服务器到 Node.js 程序后
- 使用 open.window() 在新窗口中打开 js 程序
- 我的Processing.js程序中的所有角度怎么都是度而不是弧度呢
- 检测大型JS程序中的任何变量何时设置为NaN
- 节点JS程序过早结束
- MEAN环境下的Node.js程序结构
- 为什么这个简单的Mongoose.js程序在执行'嵌套'保存
- Angular/JS程序意外提前结束
- c++和JS程序共享内存
- 管道hexdump输出到node js程序