如何将 Java 源代码交叉编译为 JavaScript?
Posted
技术标签:
【中文标题】如何将 Java 源代码交叉编译为 JavaScript?【英文标题】:How to Cross-Compile Java Source Code to JavaScript? 【发布时间】:2010-10-01 05:12:28 【问题描述】:给定一组 Java 源代码文件,我如何将它们编译成一个或多个可与手工制作的 javascript 一起使用的 JavaScript 文件?
GWT 是一种选择,但到目前为止我看到的每个示例都旨在构建精美的网站。只需将 Java 源代码转换为 Javascript 即可与手工制作的 JavaScript 一起使用的简单用例hasn't been well-documented。
我在这个主题上发起了thread on the GWT mailing list,但对于这是否可行,似乎意见不一。
有人给出了一个非常有用的提示,那就是查看GWT-Exporter。问题是源代码和文档都不是现成的,尽管有this 和this。
编辑:GWT-Exporter 源代码为here
我也见过Java2Script。但同样,我无法找到如何解决我的简单用例的示例。
解决这个问题的最佳方法是什么?我还缺少什么更好的东西吗?
【问题讨论】:
这个问题讨论了一个非常相似的主题:使用 GWT 将 Java 库编译为 JavaScript。 ***.com/questions/3125556/… 非常彻底的问题。你在表达你已经探索过的东西方面做得很好。做得很好。 您可以尝试在您的 java 项目中使用 Scala-js github.com/lampepfl/scala-js - java/scala interoperability scala-lang.org/old/faq/4) 【参考方案1】:给定一组 Java 源代码文件,我如何将它们编译成一个或多个可与手工制作的 JavaScript 一起使用的 JavaScript 文件?
虽然有很多solutions to convert Java applications to Javascript,但您对新的javascript 代码可以与生成的代码交互的解决方案感兴趣。这是其他答案的更新(如 2018 年)。
有不同类型的工具。例如,您可能会找到允许您 (1) 将 java 代码转换为 javascript 的工具; (2) 将字节码转换为 javascript、asm.js 或 webassembly; (3) 直接在浏览器中执行 java 应用程序和 (4) 创建结合 java 和 javascript 的解决方案。您必须根据自己的要求选择要使用的解决方案。
将 Java 源代码转换为 Javascript
一些解决方案采用 java 源代码并生成 javascript 等效版本。通常,这些解决方案将 Java 转换为 Javascript,但并不支持 Java 运行时的所有行为和库。生成的代码可能不支持某些 java 标准库。通常,它们用于使用 Java 创建 html 应用程序,但不用于迁移代码。 优点:生成的解决方案可能包含非常小的文件。您可以使用它来重用您自己的业务逻辑类,而无需考虑 GUI 或特定于平台的库。 缺点:您可能无法使用 Java 平台的某些功能。它需要访问源代码。
JSweet 将 Java 转换为 javascript。它包括 1000 多个 javascript 库的 API 绑定。您可以编写使用这些库的 java 代码。 它将java转换为typescript,然后使用typescript编译器创建相应的javascript。 可以产生multiple types of javascript modules and typescript definitions。您可以非常轻松地在 javascript 中使用生成的代码。 j2s,是 Eclipse RAP 平台用来将 java 代码翻译成 javascript 的编译器。它用于将 SWT (GUI) 小部件转换为 javascript 和 HTML。它不支持所有的 Java 标准库 它可以convert simple Java classes 用于javascript。您必须使用考虑到 j2s 执行的OO Java-Javascript simulation 的类。将 Javascript 字节码转换为 javascript
这些解决方案采用已编译的 java 代码(.class 文件)并在 javascript、asm.js 或 webassembly 中生成等效代码。考虑到 java 代码可能依赖于 java 标准库(即 JRE),这些解决方案通常包括移植和预编译的库。 优点:您无需更改代码中的任何内容。您也不需要源代码。 缺点:最终的解决方案可能需要加载大量文件。
Bck2Brwsr,一个 Java VM,可以提前将 java 字节码编译为 javascript。它为每个 .jar 文件生成一个 javascript 文件。 您可以使用vm
javascript 对象将类加载到javascript 中并执行静态方法(使用vm.loadClass(.., function(class)..
)。 the gradle plugin 和 the maven task 的文档中有一个示例。
TeaVM 是另一个 Java VM,可以提前将代码转换为 javascript。与 Bck2Brwsr 相比,它支持线程,为所有类生成单个文件并提供更好的调试支持。
您可以使用javaMethods.get(..).invoke(...)
方法call java from javascript。
DukeScript,使用 Bck2Brwsr 或 TeaVM 将 java 代码和字节码转换为 javascript。
它提供maven tasks to compile the java code。生成的代码(以及从 javascript 调用 java 的技术)取决于使用的转译器。
Dragome,将 java 字节码转换为 javascript。
您可以annotate static methods in Java and use it in Javascript:例如您可以使用@MethodAlias(alias="windows.method1")
注释方法并使用window.method1()
从javascript 调用它
CheerpJ (商业产品) 可以使用 Swing 和 AWT 运行完整的 java 应用程序。它提供了一个非常完整的 JavaScript 环境,支持操作系统、线程和网络功能。
它提供了一个完整的runtime API。您可以使用cheerpjRunMain( <class>, <jar> )
运行main
方法。您可以使用cjNew( <class>, <params>...)
创建对象并使用cjCall( <class>,<method>,<params>...)
调用静态方法。您可以考虑许多其他方法。
在 Javascript 中运行 Java 代码
DoppioJVM 是一个用 Typescript 编写的完整 JVM。 优点:它模拟了操作系统的许多元素,包括文件系统、TTY 控制台和线程。 缺点:考虑到它是一个解释器,它可能会导致比其他解决方案慢。 (我没有测试过)
DoppioJVM 是一个用 Typescript 编写的 JVM documentation 包含用于加载和运行类的 sn-ps 代码。您可以使用jvm.runClass( <class>, [ <args>...], function(response)..)
运行静态方法。您可以运行 Jar 文件并执行许多其他任务。
创建结合 Java 和 Javascript 的应用程序
其他一些解决方案不仅提供编译代码的工具,还提供创建 java 和 javascript 解决方案的框架和解决方案。例如,CheerpJ 具有用于图形用户界面的完整版本的 Swing 和 AWT 库,但它们可能会导致非常慢。您可以使用在浏览器上运行速度更快的新 HTML 版本来替换用户界面。 优点:您可以重用现有代码而无需更改,主要是一些库和业务逻辑。您可以从您的解决方案库中删除在浏览器中运行效率不高的解决方案库。 缺点:如果你想继续维护你的 java 桌面版本,你必须为浏览器处理不同的代码。
GWT 将 Java 代码转换为 javascript,但使用一组不同的库用于用户界面和客户端到服务器的通信。 文档维护information of differences with the JRE 您可以export Java classes 供Javascript 代码使用。 Dukescript 使用前面提到的转换工具。 它提供了一个Knockout4j 库,可以轻松地与 HTM、DOM 和其他 javascript 代码交互。 Dragome 不仅转换 java 代码,还包括与 HTML/DOM 交互的方法 您可以对bind java objects to HTML elements 和handle the DOM 使用注释 HTML/Java API 是一个 Apache 项目,它标准化了从转译代码对 HTML/DOM/javascript 的访问 它由Dukescript 和其他工具提供商捐赠。推荐
如果你想重用自己创建的几个类,你可以试试JSweet。您可以创建可以轻松与 javascript 和 typescript 一起使用的 javascript 模块(库)。 如果您想重用依赖多个 java 库的中型到大型代码库,您可以尝试CheerpJ、Dukescript 或Dragome。您可以重用大部分代码,并使用对浏览器更友好的技术(逐步)创建用户界面和客户端到服务器的通信。 如果你想运行完整的java应用程序而不做任何改变,你可以试试CheerpJ。它可以运行 Swing 和 AWT 用户界面。它还提供Applet runner。【讨论】:
【参考方案2】:并非完全切题,但Kotlin 是一种 100% 与 Java 兼容的语言,可以编译为 JavaScript。
IntelliJ IDEA 可以自动将 Java 转换为 Kotlin 并编译它以在 Node 或浏览器上运行。
【讨论】:
Kotlin 的运行时间约为 1MB。 这仅适用于代码 100% 用 Kotlin 编写的情况,因为如果您使用 Java 库,Kotlin 无法编译为 Javascript。【参考方案3】:我不确定它是否适合您的用例,但如果您同意放弃 Java API 并使用 Java 中的 JavaScript API,那么您可以使用JSweet,这是一个构建在 TypeScript 之上的 Java 到 JavaScript 转换器。它使您可以访问数百个类型良好的 JavaScript API(DOM、jQuery、下划线、angularjs 等)。它会生成 JavaScript 代码,您可以将其与旧版 JavaScript 和 TypeScript 代码混合使用。
注意:JSweet不适用于旧版 Java 代码和旧版 Java API,但您的用例并未提及重用旧版代码。
[更新] 从 1.1 版本开始,JSweet 现在还支持一些 Java API,例如 Collections (java.util)。因此,在一定程度上重用遗留 Java 代码是可能的。添加您自己对 Java API 的支持也非常简单。
【讨论】:
这似乎太严格了。它说它找不到 X、Y、Z 类。有什么办法可以让它不那么严格吗?我什至只需要一个 TS 近似值,在那里我可以手动修复任何剩余的错误。我只想要一些我可以指向包结构的东西,然后它会吐出一个 TS 等价物。 jsweet能做到吗? 我希望***.com/questions/39253788/installed-jsweet-now-what 能就此事提供足够的细节。【参考方案4】:虽然问题是关于将 Java 源代码编译为 JavaScript,但我认为值得一提的是 TeaVM 将 Java 字节码编译为 JavaScript。我从未尝试过,但看起来很有希望。
【讨论】:
【参考方案5】:这里有另外两个选项,需要调查的事情和第三个选项不转换,只是一起生活。
-
Java2Javascript
我一直想试试这个 -- 看起来更接近所要求的内容。引用网页:
一个 Eclipse Java 到 JavaScript 编译器插件和一个 JavaScript 版本的 Eclipse Standard Widget Toolkit (SWT) 与其他常用实用程序,例如 java.lang.* 和 java.util.*。您可以通过 Java2Script Pacemaker 将基于 SWT 的富客户端平台 (RCP) 转换为富 Internet 应用程序 (RIA)。
Javascript 经验有限 - 您需要移植必要的依赖项或通过 jQuery 等工具找到替代方案。
-
DukeScript
当我查看 DukeScript 时,它会编译一些前端 Javascript,并从浏览器的 Javascript 中调用 Java。它似乎或多或少是一种混合方法,因此您可以使用来自 Javascript 的大量 Java 库。我会违反 Java 的浏览器安全策略。
利用 Java 运行时的更全面的 Java 体验。如果我想在浏览器环境之外使用它,我会在 Java 上使用 Javascript。
-
Nashhorn
将此视为使用 Java 资源作为 Javascript 基础的示例:Nashorn and JavaFX,作为富 Javascript 操作客户端的示例。无论如何,使用 Java 中的 Javascript 引擎,您不需要在 Javascript-VM 到对象代码到 Java-VM 之间进行太多转换。
【讨论】:
您对 DukeScript 的看法并不完全正确。您还可以使用 TeaVM 或 bck2brwsr 作为 VM 在浏览器中运行 DukeScript 应用程序。 这是我的理解,我需要一个描述性的“V/M 插件”。该选项不是“执行 javascript”,而是从 Javascript 调用 Java。 bck2brwsr 和 TeaVM 不是插件。它们的主要目的是在不需要插件的情况下在浏览器中运行 Java 代码。因此它不会“违反 Java 的浏览器安全策略”。 嗨——我需要查看 DukeScript,DukeScript 过去需要目标机器上的 Java 库才能运行。或者您只需要使用一组有限的方法。 TeaVM 看起来像这个主意。它没有说明支持什么版本的 Java 和 Java API。对 GWT 的引用是否意味着我们与上个世纪的 Java 1.6 配置文件相提并论? 浏览器中可用的Java API确实是有限的。 bck2brwsr 有两个配置文件,compact (hudson.apidesign.org/view/bck2brwsr/job/bck2brwsr.javadoc/…) 和 mini。这个想法类似于 GWT,只提供在基于浏览器的客户端中真正有意义的核心 API。如果您需要完整的配置文件,您必须创建一个桌面应用程序。【参考方案6】:给定一组Java源代码文件,我如何将它们编译成一个 或更多可用于手工制作的 JavaScript 文件 JavaScript?
内置 Java API 和 Java 语言功能与 JavaScript 之间没有直接关联。因此,任何创建“转换器”的尝试都是不完整的。作为一个基本示例,Java 类没有直接对应的 JavaScript 习语。
如果没有源代码,就不可能知道不完整的转换工具是否适用于您的用例。
也就是说,我对解决您的问题的建议是首先尝试使用GWT:设置一个演示项目,放入您的库的源代码并从 JavaScript 端调用它,然后查看 GWT 输出的内容.js 文件。此处其他发帖人建议的其他一些工具也绝对值得一试。
如果这是卓有成效的,并且能让你参与其中,那就太好了。
从那里,您需要/想要手动完成剩余的转换。毕竟,假设您希望代码实际正常运行,那么手动审查肯定是合适的。一些与它一起转换的单元测试也是理想的。
您没有说明您的项目的源代码有多大,但如果它很小(比如说少于一千行代码),即使是完全手动转换也不应该是非常困难的。如果它比这大得多,我建议您检查一下您是否真的想要将其作为 JavaScript 代码。
【讨论】:
【参考方案7】:当您使用 GWT 时,您基本上是将 UI 部分转换为 Javascript(并且假定您使用编写 Java 时提供的 UI 小部件)。在 Javascript 中只能访问一些 Java 库。通常在 GWT 应用程序中,任何大量使用 Java 库的东西都将在服务器端运行并作为 AJAX(GWT 为您处理)连接到 Javascript。因此,GWT 不一定将您的完整应用程序转换为 Javascript(尽管如果您愿意限制对 Java 库和某些功能的使用,它可以)。
无论如何,如果这种方法(从 Javascript 中调用在服务器上运行的 Java)对您有吸引力,一个不错的选择是 DWR,它基本上允许您的 Javascript 直接调用运行在服务器(无需构建 Web 服务或其他前端)。不是你问的,我知道。
更相关的是,似乎有 sample app demonstrating the use of gwt-exporter 的源代码。
【讨论】:
这将是一个相当小的非 gui java 库。我没有见过 DWR,它看起来对大型项目非常有用。我什至没有看到 gwt-exporter 项目的源目录 - 感谢您指出。这看起来很有希望。 这里是示例应用的新链接:code.google.com/p/gwt-exporter/source/browse/trunk/samples/src/… 新链接也失效了。 :// 这是一个新链接:code.google.com/p/gwt-exporter/source/browse/samples/… 另外,这里有一个指向 gwt-exporter 项目主页的链接——这不太可能改变(示例应用程序在更改目录格式时会更改位置):code.google.com/p/gwt-exporter以上是关于如何将 Java 源代码交叉编译为 JavaScript?的主要内容,如果未能解决你的问题,请参考以下文章