当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何将Java源代码交叉编译为JavaScript?》经验,为你挑选了4个好方法。

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

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

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

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

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

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

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



1> Jacob Mattis..:

当您使用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> Renaud Pawla..:

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



3> Katona..:

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



4> Jaime..:

给定一组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代码。

它将java转换为打字稿,然后使用打字稿编译器创建相应的javascript。

它可以产生多种类型的javascript模块和打字稿定义。您可以非常轻松地在javascript中使用结果代码。

j2s是Eclipse RAP平台用来将Java代码转换为javascript的编译器。在此处用于将SWT(GUI)小部件转换为javascript和HTML。它不支持所有Java标准库

它可以将简单的Java类转换为在javascript中使用。您必须使用考虑到j2s执行的OO Java-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相比,它支持线程,为所有类生成一个文件,并提供更好的调试支持。

您可以使用方法从javascript调用JavajavaMethods.get(..).invoke(...)

DukeScript,使用Bck2Brwsr或TeaVM将Java代码和字节码转换为javascript。

它提供了Maven任务来编译Java代码。产生的代码(和从javascript调用Java的技术)取决于所使用的编译器。

Dragome,将Java字节码转换为javascript。

您可以使用Java注释静态方法并在Javascript中使用它:例如,您可以使用注释方法@MethodAlias(alias="windows.method1")并使用javascript从javascript中调用它window.method1()

CheerpJ (一种商业产品)可以使用Swing和AWT运行完整的Java应用程序。它提供了一个非常完整的javascript环境,支持操作系统,线程和网络功能。

它提供了完整的运行时API。您可以main使用运行方法cheerpjRunMain( , )。您可以使用创建对象cjNew( , ...)并使用调用静态方法cjCall( ,,...)。您可能会考虑许多其他方法。


在Javascript中运行Java代码

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

DoppioJVM是用Typescript编写的JVM

该文档包含用于加载和运行类的代码片段。您可以使用运行静态方法jvm.runClass( , [ ...], function(response){..})。您可以运行Jar文件并执行许多其他任务。


创建结合Java和Javascript的应用程序

其他一些解决方案不仅提供了用于编译代码的工具,还提供了用于创建Java和JavaScript解决方案的框架和解决方案。例如,CheerpJ具有用于图形用户界面的Swing和AWT库的完整版本,但它们的生成速度可能非常慢。您可以使用在浏览器上运行得更快的新HTML版本来替换用户界面。优点:您可以重用现有代码,而无需进行更改,主要是一些库和业务逻辑。您可能会从解决方案库中删除那些无法在浏览器中高效运行的库。缺点:如果要继续维护Java桌面版本,则必须为浏览器处理不同的代码。

GWT将Java代码转换为javascript,但为用户界面和客户端到服务器的通信使用了一组不同的库。

该文档维护与JRE差异的信息

您可以导出Java类以供Javascript代码使用。

Dukescript使用前面提到的转换工具。

它提供了一个Knockout4j库,可以轻松与HTM,DOM和其他javascript代码进行交互。

Dragome不仅可以转换Java代码,而且还可以与HTML / DOM进行交互

您可以使用批注将Java对象绑定到HTML元素并处理DOM。

HTML / Java API是一个Apache项目,它标准化了从转码后对HTML / DOM / javascript的访问

它是由Dukescript和其他工具提供商捐赠的。


建议

如果您想重用自己创建的几个类,可以尝试JSweet。您可以创建可轻松与javascript和打字稿一起使用的javascript模块(库)。

如果您想重用依赖于多个Java库的中型到大型代码库,则可以尝试CheerpJ,Dukescript或Dragome。您可以重用代码的大部分内容,并使用对浏览器更友好的技术来(逐渐)创建用户界面和客户端到服务器的通信。

如果您想运行完整的Java应用程序而不进行更改,则可以尝试CheerpJ。它可以运行Swing和AWT用户界面。它还提供了一个Applet运行程序。

推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有