【发布时间】:2012-11-14 05:14:11
【问题描述】:
做它需要做的事情。
在 rhino 上,它基本上使用 java.io.File、java.io.FileOutputStream 和 java.io.FileInputStream 来实现它需要做的文件系统修改。
(背景:我正在努力为基于 Maven 的 Java/Javascript 开发人员提供更好的开发体验。作为 Maven,既有约定俗成的力量,也有固执己见的力量。您可以在jszip.org 看到进展。)
所以我想做的是让磁盘上的结构神奇地显示为虚拟文件系统。
所以在磁盘上我们会有这样的结构:
/
/module1/src/main/js/controllers/controller.js
/module2/src/main/js/models/model.js
/module3/src/main/js/views/view.js
/webapp/src/build/js/profile.js
/webapp/src/main/js/main.js
/webapp/src/main/webapp/index.html
/webapp/src/build/js/profile.js 应该如下所示:
({
appDir: "src",
baseUrl:".",
dir: "target",
optimize: "closure",
modules:[
{
name:"main"
}
]
})
这样
当 r.js 请求
new File("src/main.js")时,我实际上会给它new File("/webapp/src/main/js/main.js")当它要求
new File("profile.js")时,我会给它new File("/webapp/src/build/js/profile.js")当它要求
new File("controllers/controller.js")时,我会给它new File("/module1/src/main/js/controllers/controller.js")当它要求
new File("target")时,我会给它new File("/webapp/target/webapp-1.0-SNAPSHOT")。
编写所需的三个模拟类没有问题,即用来代替java.io.File、java.io.FileInputStream 和java.io.FileOutputStream 的类,
this 等一些问题的答案指向 ClassShutter 之类的东西,我可以看到我可以像这样使用它:
context.setClassShutter(new ClassShutter() {
public boolean visibleToScripts(String fullClassName) {
if (File.class.getName().equals(fullClassName)) return false;
if (FileOutputStream.class.getName().equals(fullClassName)) return false;
if (FileInputStream.class.getName().equals(fullClassName)) return false;
return true;
}
});
隐藏原始实现。
然后问题是让 Rhino 解决沙盒等价物......我继续得到 p>
TypeError: [JavaPackage java.io.File] is not a function, it is object.
即使我在调用前加上java.io.File = org.jszip.rhino.SandboxFile 的执行,也将我的沙盒实现映射到现在缺少的java.io.File
我什至可以考虑在编译之前对加载的r.js 文件使用搜索和替换...但我觉得必须有更好的方法。
有人有什么提示吗?
【问题讨论】:
标签: java javascript requirejs sandbox rhino