给定一组 Java 源代码文件,我如何将它们编译成一个或多个可与手工制作的 JavaScript 一起使用的 JavaScript 文件?
尽管有许多将 Java 应用程序转换为 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 代码。
- j2s是 Eclipse RAP 平台用于将 java 代码转换为 javascript 的编译器。它用于将 SWT (GUI) 小部件转换为 javascript 和 HTML。它不支持所有的 Java 标准库
将 Javascript 字节码转换为 javascript
这些解决方案采用编译后的 java 代码(.class 文件)并在 javascript、asm.js 或 webassembly 中生成等效代码。考虑到 java 代码可能依赖于 java 标准库(即 JRE),这些解决方案通常包括移植和预编译的库。优点:您不需要更改代码中的任何内容。您也不需要源代码。缺点:生成的解决方案可能需要加载大量文件。
- Bck2Brwsr,一个 Java 虚拟机,可以提前将 java 字节码编译为 javascript。它为每个 .jar 文件生成一个 javascript 文件。
- 您可以使用
vm
javascript 对象将类加载到 javascript 中并执行静态方法(使用vm.loadClass(.., function(class){..}}
)。gradle plugin和maven task的文档中有一个示例。
- TeaVM是另一个 Java VM,可以提前将代码转换为 javascript。与 Bck2Brwsr 相比,它支持线程,为所有类生成单个文件并提供更好的调试支持。
- DukeScript,使用 Bck2Brwsr 或 TeaVM 将 java 代码和字节码转换为 javascript。
- Dragome,将 java 字节码转换为 javascript。
- CheerpJ (一种商业产品)可以使用 Swing 和 AWT 运行完整的 java 应用程序。它提供了一个非常完整的 JavaScript 环境,支持操作系统、线程和网络功能。
- 它提供了完整的运行时 API。您可以
main
使用cheerpjRunMain( <class>, <jar> )
. 您可以使用创建对象cjNew( <class>, <params>...)
并使用调用静态方法cjCall( <class>,<method>,<params>...)
。您可以考虑许多其他方法。
在 Javascript 中运行 Java 代码
DoppioJVM 是一个用 Typescript 编写的完整 JVM。优点:它模拟了操作系统的许多元素,包括文件系统、TTY 控制台和线程。缺点:考虑到它是一个解释器,它可能会比其他解决方案慢。(我没有测试过)
- DoppioJVM是一个用 Typescript 编写的 JVM
- 该文档包括用于加载和运行类的代码片段。您可以使用
jvm.runClass( <class>, [ <args>...], function(response){..})
. 您可以运行 Jar 文件并执行许多其他任务。
创建结合 Java 和 Javascript 的应用程序
其他一些解决方案不仅提供编译代码的工具,还提供创建 java 和 javascript 解决方案的框架和解决方案。例如,CheerpJ 具有用于图形用户界面的完整版本的 Swing 和 AWT 库,但它们可能会导致非常慢。您可以使用在浏览器上运行速度更快的新 HTML 版本来替换用户界面。优点:您可以重用现有代码而无需更改,主要是一些库和业务逻辑。您可以从您的解决方案库中删除在浏览器中运行效率不高的解决方案库。缺点:如果你想继续维护你的 java 桌面版本,你必须为浏览器处理不同的代码。
- GWT将 Java 代码转换为 javascript,但使用一组不同的库用于用户界面和客户端到服务器的通信。
- Dukescript使用前面提到的转换工具。
- 它提供了一个Knockout4j库,可以轻松地与 HTM、DOM 和其他 javascript 代码交互。
- Dragome不仅转换 java 代码,还包括与 HTML/DOM 交互的方法
- HTML/Java API是一个 Apache 项目,用于标准化从转译代码对 HTML/DOM/javascript 的访问
推荐
- 如果你想重用自己创建的几个类,你可以试试JSweet。您可以创建可以轻松与 javascript 和 typescript 一起使用的 javascript 模块(库)。
- 如果您想重用依赖多个 java 库的中型到大型代码库,您可以尝试CheerpJ、Dukescript或Dragome。您可以重用大部分代码,并使用对浏览器更友好的技术(逐渐)创建用户界面和客户端到服务器的通信。
- 如果您想运行完整的 Java 应用程序而无需更改,您可以尝试CheerpJ。它可以运行 Swing 和 AWT 用户界面。它还提供了一个Applet 运行器。