在Java上从Rhino启动jsdom

我正在跟进这个答案 :

我设法在Java上运行Rhino Engine的简单JavaScript代码。

但是当谈到D3.js时 ,例如:

 var svg = d3.select("body").append("svg") 

正如您所见, d3要求DOM首先可用。

所以,出于这个原因, JSDOM应该是解决方案。

但是JSDOM恰好依赖于requirejs

来自RequireJs网站:

r.js文件允许您运行优化器以及在Node, Rhino或xpcshell中运行模块。

然后我的Java Rhino代码如下所示:

 FileReader fr1 = new FileReader("lib/r.js"); FileReader fr2 = new FileReader("lib/jsdom.js"); engine.eval(fr1); engine.eval(fr2); 

但是现在我最终出现了这样的错误:

ReferenceError:未定义“arguments”。

然后我找到了这个很好的答案 :

然后我的代码看起来像这样:

 cx.evaluateReader(sharedScope, new FileReader("lib/r.js"), "require", 1, null); cx.evaluateReader(sharedScope, new FileReader("lib/loader.js"), "loader", 1, null); cx.evaluateReader(sharedScope, new FileReader("lib/jsdom.js"), "loader", 1, null); 

错误:尚未加载模块名称“fs”

这基本上意味着jsdom.js本身引用:

 var fs = require('fs'); var path = require('path'); var URL = require('url'); 

所以,似乎我只需要下载所有这些。

但是fs – 是关于文件系统的 。 这意味着它依赖于NodeJs的本机实现。 这对我在普通java和普通js方面的尝试不利

更新:

现在我正朝这个方向做研究:

 https://github.com/nodyn/jvm-npm http://nodyn.io/ 

问题是:如何将JSDOM加载到Rhino以让D3.js生成我的SVG?

再一次: Java Rhino – > D3.JS – > JSDOME – > RequireJS – > FS => SVG?

“或” : Mozilla Rhino如何使用nodejs“fs”模块?

我知道我可以使用PhantomJS ,但我正在寻找具有Java粘性的东西。 更轻巧,无需外部处理启动。

JsDom可能是一个糟糕的选择,因为它依赖于Node和Google的V8 JavaScript引擎的许多内部function。 Env.JS应该是一个更好的选择,但如果它不起作用,那么你可能运气不好。 它可能不起作用,因为它本质上是2010年最后一个版本的冻结项目。您必须在Node或Phantom中运行JavaScript,或者使用基于Java的解决方案(如Apache Batik)生成SVG。

顺便说一句,JsDom中的require与require.js不同,而是内置的Node.js函数 。

另一种方法是使用Domino作为DOM环境。 请看这里( http://jazdw.net/content/server-side-svg-generation-using-d3js )了解详情。 阅读评论部分也会有所帮助