【发布时间】:2015-06-02 14:49:40
【问题描述】:
我是 GWT(将 Java 转换为在浏览器中运行的 JavaScript)的忠实粉丝,但是是否有任何工具可以将 Java 转换为 JavaScript 以在 JVM 中运行(通过 Nashorn 或 Rhino)?
更新
更多信息...我正在探索的想法是将后端代码编译为 JavaScript,然后将其存储在数据库中。然后,Web 应用程序可以从数据库中提取一个后端“模块”并在服务器上执行它。
更新
我不会将此作为答案发布,因为我怀疑这是一个好主意,但出于好奇,我尝试在 JVM 中运行 GWT 生成的 JavaScript。在“详细”级别编译时,我不得不模拟 GWT 期望存在的 3 个 DOM 对象(hack!),但它确实有效。
Test.gwt.xml
<module rename-to='test'>
<entry-point class='test.client.Test'/>
<source path='client'/>
<source path='shared'/>
<super-source path="jre"></super-source>
<add-linker name="xsiframe"/>
</module>
...注意超级源jre...
test/client/Test.java
public class Test implements EntryPoint {
public void onModuleLoad() {
print("" + new File("/Users/.../someFile.txt").exists());
print("Hey");
}
public native void print(String msg) /*-{
print(msg);
}-*/;
}
...模拟的 File 类...
test/jre/java/io/File.java
public class File {
public File(String name) {
_init(name);
}
private native void _init(String name) /*-{
this._obj = new java.io.File(name);
}-*/;
public native boolean exists() /*-{
return this._obj.exists();
}-*/;
}
测试/RhinoTest.java
public class RhinoTest {
public static void main(String[] args) throws IOException, ScriptException {
String js = FileUtils.readFileToString(new File("/Users/.../Test/war/test/130CD4F977EDEB096DFEF9871580F1CD.cache.js"));
js = "var $wnd = { test: { __sendStats: function() {} } };"
+ js;
new ScriptEngineManager().getEngineByName("JavaScript").eval(js);
}
}
生产:
trueHey
【问题讨论】:
-
Rhino 将 js 编译成类,你可以提供一个 Applet 运行时(出于安全考虑)并直接运行编译后的 Java 代码。
-
我刚刚更新了我的问题,提供了有关我的用例的更多信息。我需要在服务器上运行这个,而不是在浏览器中。除非你知道一些我不知道的事情,否则在服务器中运行一个小程序并不比动态加载一个 jar 并运行它更容易。
-
你为什么不直接写 JavaScript 呢?
-
我们是一家全 Java 商店。我们有大型应用程序,并且该组织有意选择 Java,因为静态类型提供的结构。我正在考虑为我们现有的应用程序使用替代部署策略。如果我建议我们用 JavaScript 重写所有应用程序,那对话就不会顺利 =)。
-
你看过osgi栈吗?像春分或阿帕奇菲利克斯?否则我认为以这种方式使用 gwt 的想法似乎对你有用 - 你应该回答这个问题,或者改写它,因为我认为没有问题需要回答了:-)
标签: java javascript gwt rhino nashorn