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

时间:2009-01-13 19:01:16

标签: javascript java code-translation

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

GWT是一种选择,但到目前为止我见过的每个例子都是为了建立精美的网站。将Java源代码转换为Javascript的简单用例,可以与手工编写的JavaScript hasn't been well-documented一起使用。

我在这个问题上开始thread on the GWT mailing list,但是对于这是否可行,看起来似乎有些混淆。

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

编辑:GWT-Exporter源代码为here

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

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

7 个答案:

答案 0 :(得分:10)

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

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

更相关的是,它看起来像sample app demonstrating the use of gwt-exporter的源代码。

答案 1 :(得分: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的支持也非常简单。

答案 2 :(得分:8)

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

答案 3 :(得分:3)

这是另外两个选项,需要考虑的事情和第三个不转换的选项,只是共同生活。

  1. Java2Javascript
  2. 我一直想尝试这一点 - 看起来更接近被问到的问题。引用网页:

      

    Eclipse Java to JavaScript编译器插件以及Eclipse标准窗口小部件工具包(SWT)的JavaScript版本的实现,以及其他常用实用程序,例如java.lang。*和java.util。*。您可以通过Java2Script Pacemaker将基于SWT的富客户端平台(RCP)转换为富Internet应用程序(RIA)。

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

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

      利用Java运行时更全面的Javascript Java体验。如果我想在浏览器环境之外使用Javascript on Java。

      1. Nashhorn
      2. 将此视为使用Java资源作为Javascript基础的示例: Nashorn and JavaFX ,作为丰富的Javascript操作客户端的示例。无论如何,在Java中使用Javascript引擎,你不需要在Javascript-VM和对象代码之间将其转换为Java-VM。

答案 4 :(得分:3)

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

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

答案 5 :(得分:3)

  

给出一组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代码。
  • j2s是Eclipse RAP平台用来将Java代码转换为javascript的编译器。在此处用于将SWT(GUI)小部件转换为javascript和HTML。它不支持所有Java标准库

将Java字节码转换为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 pluginthe maven task的示例。
  • TeaVM,是另一个Java VM,可以提前将代码转换为javascript。与Bck2Brwsr相比,它支持线程,为所有类生成一个文件,并提供更好的调试支持。
  • DukeScript,使用Bck2Brwsr或TeaVM将Java代码和字节码转换为javascript。
  • Dragome,将Java字节码转换为javascript。
  • CheerpJ (一种商业产品)可以使用Swing和AWT运行完整的Java应用程序。它提供了一个非常完整的javascript环境,支持操作系统,线程和网络功能。
    • 它提供了完整的runtime API。您可以使用main运行cheerpjRunMain( <class>, <jar> )方法。您可以使用cjNew( <class>, <params>...)创建对象,并使用cjCall( <class>,<method>,<params>...)调用静态方法。您可能还会考虑其他许多方法。

使用Javascript运行Java代码

DoppioJVM是用Typescript编写的完整JVM。 优点::它模拟了操作系统的许多元素,包括文件系统,TTY控制台和线程。 缺点:考虑到这是一个问题,它可能会比其他解决方案慢。 (我没有测试过)

  • DoppioJVM是用Typescript编写的JVM
    • documentation包含用于加载和运行类的代码段。您可以使用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 runner

答案 6 :(得分:1)

  

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

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

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


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

如果这是富有成效的,并让你走的路,那很好。

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

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