如何将Java源代码交叉编译为JavaScript?

Ric*_*aca 51 javascript java code-translation

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

GWT是一种选择,但到目前为止我见过的每个例子都是为了建立花哨的网站.将Java源代码转换为可与手工JavaScript一起使用的Javascript的简单用例尚未得到充分记录.

我在这个主题的GWT邮件列表上开始了一个帖子,但是对于这是否可行而言,看起来似乎有些混淆.

一个人提供了一个非常有用的提示,即检查GWT-Exporter.问题是源代码和文档都不是现成的,尽管有这个这个.

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

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

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

Jac*_*son 10

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

无论如何,如果这种做法(出调用到Java在JavaScript中的服务器上运行),你能想到的,一个不错的选择是DWR,它基本上可以让你的Javascript直接调用Java类的服务器上运行的方法(不用您构建Web服务或其他前端).我知道,不是你问的.

更贴切,它看起来像有源代码,一个示例应用程序展示了如何使用GWT-出口国.

  • gwt-exporter链接已经死了 (2认同)

Ren*_*lak 9

我不确定它是否适合您的用例,但如果您同意删除Java API并使用Java中的JavaScript API,那么您可以使用JSweet,这是一个构建在TypeScript之上的Java to JavaScript转换器.它使您可以访问数百种类型良好的JavaScript API(DOM,jQuery,下划线,angularjs等).它生成JavaScript代码,您可以将其与旧版JavaScript和TypeScript代码混合使用.

注意:JSweet 不适用于旧版Java代码和旧版Java API,但您的用例未提及重用遗留代码.

[更新]从版本1.1开始,JSweet现在还支持一些Java API,例如Collections(java.util).因此,可以在一定程度上重用遗留Java代码.添加自己对Java API的支持也非常简单.


Kat*_*ona 8

虽然问题是关于将Java源代码编译为JavaScript,但我认为值得一提的是有TeaVM将Java字节码编译为JavaScript.我从来没有尝试过,但似乎非常有希望.


wil*_*ill 5

这是另外两个选项,需要研究的内容和第三个选项不转换,只是住在一起。

  1. Java2Javascript

我一直想试试这个——看起来更接近被问到的问题。引用网页:

一个 Eclipse Java 到 JavaScript 编译器插件和一个 JavaScript 版本的 Eclipse 标准小部件工具包 (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 之间进行太多转换。


Jai*_*ime 5

给定一组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 VM,可以提前将Java字节码编译为javascript。它为每个.jar文件生成一个javascript文件。
    • 您可以使用vmjavascript对象将类加载到javascript中并执行静态方法(使用vm.loadClass(.., function(class){..}})。文档中有gradle插件maven任务的示例。
  • 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和打字稿一起使用的javascript模块(库)。
  • 如果您想重用依赖于多个Java库的中型到大型代码库,则可以尝试CheerpJDukescriptDragome。您可以重用代码的大部分内容,并使用对浏览器更友好的技术来(逐渐)创建用户界面和客户端到服务器的通信。
  • 如果您想运行完整的Java应用程序而不进行更改,则可以尝试CheerpJ。它可以运行Swing和AWT用户界面。它还提供了一个Applet运行程序