我在GWT邮件列表上开始了一个线程讨论这个问题,但意见似乎对是否可行存在分歧。
有人给出了一个非常有用的提示,那就是查看GWT-Exporter。问题是,既没有源代码,也没有文档可以轻易获得,尽管有这个和这个。
编辑:GWT-Exporter源代码在这里。
我也看过Java2Script。但是,我没有找到解决我的简单用例的示例。
如何最好地解决这个问题?我是否错过了更好的东西?
我也看过Java2Script。但是,我没有找到解决我的简单用例的示例。
如何最好地解决这个问题?我是否错过了更好的东西?
我不确定它是否适合您的使用情况,但如果您同意放弃Java API并使用Java中的JavaScript API,则可以使用JSweet,这是一个建立在TypeScript之上的Java到JavaScript转换器。它为您提供了许多类型良好的JavaScript API(DOM、jQuery、underscore、angularjs等),生成JavaScript代码,您可以将其与旧有的JavaScript和TypeScript代码混合使用。
注意:JSweet不适用于旧有的Java代码和Java API,但您的使用情况没有提到重用旧有代码。
[更新] 自版本1.1以来,JSweet现在也支持一些Java API,例如Collections(java.util)。因此,在一定程度上可以重用旧有的Java代码。添加自己的Java API支持也非常简单。
javaMethods.get(..).invoke(...)
方法从JavaScript中调用Java。有关详细信息,请参考从JavaScript调用Java。@MethodAlias(alias="windows.method1")
来注解一个方法,并使用window.method1()
从JavaScript中调用它。cheerpjRunMain( <class>, <jar> )
运行main
方法。您可以使用cjNew( <class>, <params>...)
创建对象,并使用cjCall( <class>,<method>,<params>...)
调用静态方法。还有许多其他方法可供您参考。在Javascript中运行Java代码
DoppioJVM是一个完整的用Typescript编写的JVM。
优点:它模拟了操作系统的许多元素,包括文件系统、TTY控制台和线程。
缺点:考虑到它是一个解释器,可能比其他解决方案更慢。(我没有测试过)
jvm.runClass( <class>, [ <args>...], function(response){..})
来运行静态方法。您还可以运行Jar文件和执行许多其他任务。创建结合Java和Javascript的应用程序
一些其他解决方案不仅提供编译代码的工具,还提供创建Java和Javascript解决方案的框架和解决方案。例如,CheerpJ具有完整的Swing和AWT库版本,用于图形用户界面,但可能会导致速度很慢。您可以通过使用在浏览器上运行更快的新HTML版本来替换用户界面。
优点:您可以在不更改现有代码的情况下重用现有代码,主要是一些库和业务逻辑。您可以从解决方案中删除在浏览器中运行效率低下的库。
缺点:如果您想继续维护您的Java桌面版本,您必须处理与浏览器不同的代码。
推荐
虽然问题是关于将Java源代码编译为JavaScript,但值得一提的是,有一个名为TeaVM的工具可以将Java字节码编译为JavaScript。我从未尝试过它,但它看起来非常有前途。
有限的Java在Javascript体验 - 您需要通过像jQuery等工具移植必要的依赖项或找到替代品。 就我看来,DukeScript会编译一些前端Javascript并从浏览器的Javascript调用Java。它似乎是一种混合方法,因此您可以从Javascript中使用Java丰富的库。我会遇到Java的浏览器安全策略问题。一个Eclipse Java到JavaScript编译器插件和Eclipse Standard Widget Toolkit(SWT)的JavaScript版本实现,以及其他常见的实用程序,如java.lang.*和java.util.*。您可以通过Java2Script Pacemaker将基于SWT的Rich Client Platform(RCP)转换为Rich Internet Application(RIA)。
更完整的基于Java运行时的Javascript体验。如果我想在浏览器环境之外使用它,我会使用Javascript on Java。
考虑将Java资源作为Javascript的基础的示例:Nashorn和JavaFX,作为一个丰富的Javascript操作客户端的示例。无论如何,有了Java内部的Javascript引擎,你就不需要在Javascript-VM到对象代码到Java-VM之间进行太多的转换了。
虽然不完全相关,但Kotlin是一种100%兼容Java的语言,可以编译成JavaScript。
IntelliJ IDEA可以自动将Java转换为Kotlin并编译运行于Node或浏览器中。
这个问题来自13年前,是的,我知道。但是我会把我的补充放在这里,因为这是一个关于这个话题答案的优秀的仓库,而且因为它在谷歌搜索中排名第一,所以很可能会有最多的人看到。
我曾经是一个GWT开发者。我同意它是一个非常好的解决方案和技术。但是也如上所述,其交叉编译部分主要(可以说完全)集中在其名称中的W(Google WEB Toolkit)上:全栈SPA Web应用程序的客户端JavaScript部分,其序列化和通信,其客户端/服务器逻辑分区等。
我刚刚偶然发现了一些相对较新的东西——GWT的一个分支,2014-2015年发布,2018年放置于公共领域——我认为它更加普遍地聚焦于原始帖子(13年前)中所请求的内容。我渴望尝试它。
J2CL: https://github.com/google/j2cl
我在这里阅读了关于它的介绍,对我来说它是一个很好的、详尽的技术介绍(看看并告诉我你是否同意):
https://www.infoq.com/news/2019/05/j2cl-java-javascript-transpiler/