53

给定一组 Java 源代码文件,我如何将它们编译成一个或多个可与手工制作的 JavaScript 一起使用的 JavaScript 文件?

GWT是一种选择,但到目前为止我看到的每个示例都旨在构建精美的网站。仅将 Java 源代码转换为可与手工制作的 JavaScript 一起使用的 Javascript 的简单用例尚未得到详细记录

在 GWT 邮件列表上开始了一个关于这个主题的线程,但对于这是否可行,意见似乎不一。

一个人给出了一个非常有用的提示,那就是查看GWT-Exporter。问题是源代码和文档都不是现成的,尽管有thisthis

编辑:GWT-Exporter 源代码在这里

我也看过Java2Script。但同样,我无法找到如何解决我的简单用例的示例。

解决这个问题的最佳方法是什么?我还缺少什么更好的东西吗?

4

7 回答 7

12

当您使用 GWT 时,您基本上是将 UI 部分转换为 Javascript(并且假定您使用编写 Java 时提供的 UI 小部件)。在 Javascript 中只能访问一些 Java 库。通常在 GWT 应用程序中,任何大量使用 Java 库的东西都将在服务器端运行并作为 AJAX 连接到 Javascript(GWT 会为您处理)。因此,GWT 不一定将您的完整应用程序转换为 Javascript(尽管如果您愿意限制对 Java 库和某些功能的使用,它可以)。

无论如何,如果这种方法(从 Javascript 中调用在服务器上运行的 Java)对您有吸引力,一个不错的选择是DWR,它基本上允许您的 Javascript 直接调用在服务器上运行的 Java 类中的方法(无需您构建 Web 服务或其他前端)。不是你问的,我知道。

更相关的是,看起来有一个示例应用程序的源代码演示了 gwt-exporter 的使用

于 2009-01-13T19:47:24.587 回答
9

我不确定它是否适合您的用例,但如果您同意放弃 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 的支持也非常简单。

于 2015-12-16T09:57:26.833 回答
9

虽然问题是关于将 Java 源代码编译为 JavaScript,但我认为值得一提的是TeaVM可以将 Java 字节码编译为 JavaScript。我从未尝试过,但它似乎很有希望。

于 2015-11-17T17:14:34.003 回答
8

给定一组 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 文件。
    • 您可以使用vmjavascript 对象将类加载到 javascript 中并执行静态方法(使用vm.loadClass(.., function(class){..}})。gradle pluginmaven 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 桌面版本,你必须为浏览器处理不同的代码。


推荐

  • 如果你想重用自己创建的几个类,你可以试试JSweet。您可以创建可以轻松与 javascript 和 typescript 一起使用的 javascript 模块(库)。
  • 如果您想重用依赖多个 java 库的中型到大型代码库,您可以尝试CheerpJDukescriptDragome。您可以重用大部分代码,并使用对浏览器更友好的技术(逐渐)创建用户界面和客户端到服务器的通信。
  • 如果您想运行完整的 Java 应用程序而无需更改,您可以尝试CheerpJ。它可以运行 Swing 和 AWT 用户界面。它还提供了一个Applet 运行器
于 2018-07-15T15:11:03.783 回答
5

这是另外两个选择,需要研究的事情和第三种选择不转换,只是住在一起。

  1. Java2Javascript

我一直想试试这个——看起来更接近所要求的。引用网页:

一个 Eclipse Java 到 JavaScript 编译器插件和一个 JavaScript 版本的 Eclipse Standard Widget Toolkit (SWT) 与其他常用实用程序,例如 java.lang.* 和 java.util.*。您可以通过 Java2Script Pacemaker 将基于 SWT 的富客户端平台 (RCP) 转换为富 Internet 应用程序 (RIA)。

Javascript 经验有限的 Java - 您需要移植必要的依赖项或通过 jQuery 等工具找到替代方案。

  1. 杜克脚本

在我查看 DukeScript 时,它编译了一些前端 Javascript,并从浏览器的 Javascript 中调用 Java。它似乎或多或少是一种混合方法,因此您可以使用来自 Javascript 的大量 Java 库。我将违反 Java 的浏览器安全策略。

利用 Java 运行时的更完整的 Java 体验。如果我想在浏览器环境之外使用它,我会在 Java 上使用 Javascript。

  1. 纳什霍恩

将此视为使用 Java 资源作为 Javascript 基础的示例:Nashorn 和 JavaFX,作为富 Javascript 操作客户端的示例。无论如何,使用 Java 中的 Javascript 引擎,您不需要在 Javascript-VM 到对象代码到 Java-VM 之间进行太多转换。

于 2015-02-13T02:04:49.523 回答
4

不完全是主题,但Kotlin是一种 100% 与 Java 兼容的语言,可以编译为 JavaScript。

IntelliJ IDEA 可以自动将 Java 转换为 Kotlin 并编译它以在 Node 或浏览器上运行。

于 2016-09-03T12:31:53.370 回答
2

给定一组 Java 源代码文件,我如何将它们编译成一个或多个可与手工制作的 JavaScript 一起使用的 JavaScript 文件?

内置 Java API 和 Java 语言功能与 JavaScript 之间没有直接关联。因此,任何创建“转换器”的尝试都是不完整的。作为一个基本示例,Java 类没有直接对应的 JavaScript 习惯用法。

如果没有源代码,就不可能知道不完整的转换工具是否适用于您的用例。


也就是说,我对解决您的问题的建议是首先尝试使用GWT:设置一个演示项目,放入库的源代码并从 JavaScript 端调用它,然后查看 GWT 在它的 .js 文件中输出什么。此处其他海报建议的其他一些工具也绝对值得一试。

如果这是卓有成效的,并让您参与其中,那就太好了。

从那里,您需要/想要手动完成剩余的转换。毕竟,假设您希望代码实际正常运行,那么手动审查肯定是合适的。一些与它一起转换的单元测试也是理想的。

你没有说明你的项目的源代码有多大,但如果它很小(比如说不到一千行代码),即使是完全手动的转换也不应该是非常困难的。如果它比这大得多,我建议您检查一下您是否真的想要它作为 JavaScript 代码。

于 2013-10-05T21:12:00.997 回答