使用 JSweet 将 Java 模块移植到 JS
Posted
技术标签:
【中文标题】使用 JSweet 将 Java 模块移植到 JS【英文标题】:Port Java module to JS with JSweet 【发布时间】:2017-06-14 01:45:34 【问题描述】:我想将这些 Java 函数转换为 javascript:CircleFitter.java。 我不需要文件读取部分。
JSweet 似乎是一个不错的选择。因此,我尝试将 java 文件的内容粘贴到 online JSweet sandbox 中,但出现以下错误:
Line 58: module 'java.io' has no exported member 'FileReader'
Line 58: property 'FileReader' does not exist on type 'typeof io'
Line 58: module 'java.text' has no exported member 'DecimalFormat'
Line 58: property 'DecimalFormat' does not exist on type 'typeof text'
Line 58: module 'java.text' has no exported member 'DecimalFormatSymbols'
Line 58: property 'DecimalFormatSymbols' does not exist on type 'typeof text'
Line 58: module 'java' has no exported member 'awt'
Line 58: property 'awt' does not exist on type 'typeof java'
Line 69: property 'in' does not exist on type 'typeof System'
Line 76: property 'exit' does not exist on type 'typeof System'
Line 125: property 'exit' does not exist on type 'typeof System'
Line 128: property 'exit' does not exist on type 'typeof System'
这些错误似乎分为两类:
-
模块 __ 没有导出的成员 __
属性 __ 不存在于类型 __
我不使用 Java,所以我不知道如何解决这些问题。感谢您的帮助。
【问题讨论】:
The FAQ 说,“包 java.io:需要 J4TS candy 来支持一些 Java IO 样式和基于本地存储的 FS(测试版)。”现在弄清楚如何包含 J4TS?还是我走错了路? 实际上沙箱说它已经包含了“JSweet APIs: specs + Java APIs: J4TS” 【参考方案1】:JSweet 对 Java API 的支持有限。沙箱使用j4ts 仿真库,它不提供java.text 包的任何实现,也不提供java.io。它也不支持 System.exit(因为大多数时候它在浏览器中没有意义)。最后,对 java.awt 的任何支持都极其困难,而且只能是非常局部的。所以最好的方法是避免使用不受支持的 Java API 并用 JavaScript API 替换它们(JSweet 提供对它们的访问)。
但是,使用 JSweet,可以将一些 Java 库编译为 TypeScript/JavaScript。 J4TS organization 提供了一些关于如何编译和支持一些 Java 库的示例。如果您的程序使用不受支持的库,您可以通过多种方法来解决问题:
重写/重新设计您的程序以删除不受支持的依赖项 这样做,您可以在方法和字段上使用@jsweet.lang.Erased 注解从翻译中排除某些代码(如果您根本不想修改代码,可以在 jsweetconfig 中定义这些注解.json 文件) 为 J4TS 做贡献以添加对您要使用的 API 的支持 使用 JSweet v2,编写一个 JSweet 扩展来原生支持新的 API。JSweet v2 尚未发布,但它提供了一个 API 来扩展转译器并原生支持更多 API。我建议在可用时使用它。
【讨论】:
以上是关于使用 JSweet 将 Java 模块移植到 JS的主要内容,如果未能解决你的问题,请参考以下文章
将 nodejs 模块移植到 React Native:Object.prototype 未定义