给定一组Java源代码文件,如何将它们编译成一个或多个可以与手工制作的JavaScript一起使用的JavaScript文件?
GWT是一种选择,但到目前为止我见过的每个例子都是为了建立精美的网站。将Java源代码转换为Javascript的简单用例,可以与手工编写的JavaScript hasn't been well-documented一起使用。
我在这个问题上开始thread on the GWT mailing list,但是对于这是否可行,看起来似乎有些混淆。
一个人提供了一个非常有用的提示,即查看GWT-Exporter。问题是源代码和文档都不是现成的,尽管有this和this。
编辑:GWT-Exporter源代码为here
我也见过Java2Script。但同样,我无法找到如何解决我的简单用例的例子。
解决这个问题的最佳方法是什么?有什么更好的东西我不见了吗?
答案 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)
这是另外两个选项,需要考虑的事情和第三个不转换的选项,只是共同生活。
我一直想尝试这一点 - 看起来更接近被问到的问题。引用网页:
Eclipse Java to JavaScript编译器插件以及Eclipse标准窗口小部件工具包(SWT)的JavaScript版本的实现,以及其他常用实用程序,例如java.lang。*和java.util。*。您可以通过Java2Script Pacemaker将基于SWT的富客户端平台(RCP)转换为富Internet应用程序(RIA)。
Javascript体验中有限的Java - 您需要通过jQuery等工具移植必要的依赖项或找到替代方案。
当我查看DukeScript时,它会编译一些前端Javascript并从浏览器的Javascript调用Java。它似乎或多或少是一种混合方法,因此您可以使用来自Javascript的Java丰富的库。我将违反Java的浏览器安全策略。
利用Java运行时更全面的Javascript Java体验。如果我想在浏览器环境之外使用Javascript on Java。
将此视为使用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平台的某些功能。它需要访问源代码。
将Java字节码转换为javascript
这些解决方案采用已编译的Java代码(.class文件),并在javascript,asm.js或webassembly中生成等效的代码。考虑到Java代码可能依赖于Java标准库(即JRE),这些解决方案通常包括移植和预编译的库。 优点:您无需更改代码中的任何内容。您也不需要源代码。 缺点:最终的解决方案可能需要加载大量文件。
vm
javascript对象将类加载到javascript中并执行静态方法(使用vm.loadClass(.., function(class){..}}
)。文档中有一个the gradle plugin和the maven task的示例。javaMethods.get(..).invoke(...)
方法call java from javascript。@MethodAlias(alias="windows.method1")
注释方法,然后使用window.method1()
main
运行cheerpjRunMain( <class>, <jar> )
方法。您可以使用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桌面版本,则必须为浏览器处理不同的代码。
推荐
答案 6 :(得分:1)
给定一组Java源代码文件,如何将它们编译成一个 或更多可与手工制作一起使用的JavaScript文件 的JavaScript?
内置Java API和Java语言功能以及JavaScript语言功能之间没有直接关联。因此,任何创建“转换器”的尝试都将是不完整的。作为一个基本的例子,Java类没有直接对应的JavaScript习惯用法。
如果没有源代码,无法知道不完整的转换工具是否适用于您的用例。
那就是说,我解决你的问题的建议是首先尝试使用GWT:设置一个演示项目,放入你的库的源代码并从JavaScript端调用它,看看GWT输出了什么在它的.js文件中。其他海报建议的其他一些工具也值得一试。
如果这是富有成效的,并让你走的路,那很好。
从那里,您需要/想要手动完成转换的剩余部分。毕竟,假设您希望代码实际正常运行,那么手动审查肯定是有序的。一些单元测试与它一起转换也是理想的。
你没有说明你的项目来源有多大,但如果它很小(比如说不到一千行代码),即使手工完成转换也不是非常困难。如果它比这大得多,我建议你回顾一下你是否真的想要它作为JavaScript代码。