我需要使用 Nashorn JavaScript 引擎的软件与 Java 1.8 以上版本兼容。
如果我使用与 JDK 捆绑的那个,它将无法在 Java >= 15 上运行。如果我使用独立的 Nashorn,它将与 Java < 15 不兼容。
有没有办法保持兼容性?我已经考虑过反思,但可能有更有效的方法。
3 回答
Nashorn 维护者在这里。应该可以从 Java 11 的源代码编译独立的 Nashorn。不幸的是,我很确定我们不能低于这个值。你是直接使用它的 API 吗?在这种情况下,不幸的是,内置 Nashorn 的包名称与独立版本不匹配。如果您只能依赖javax.script.*
API,那么应该可以同时使用两者。
我想更好地了解您的用例并帮助您找到解决方案。
正如您所注意到的,Nashorn 在 Java 11 的JEP 335(JDK 增强提案)中被弃用,随后在作为 Java 15 的一部分交付的JEP 372中被删除。删除的动机是
随着 ECMAScript 语言结构以及 API 的快速调整和修改,我们发现 Nashorn 难以维护。
因此,它不会成为未来的选择。相反,如果您正在寻找替代方案,我建议您查看GraalVM 之类的选项。如介绍中所述:
它专为使用 Java、JavaScript、基于 LLVM 的语言(如 C 和 C++)以及其他动态语言编写的应用程序而设计。它消除了编程语言之间的隔离,并在共享运行时中实现了互操作性。
如果您不能简单地不为 JDK <15 分发独立的 Nashorn JAR,那么您应该能够构建它的多发行版本。
根级别应该什么都不提供,然后将所有实际的类放在META-INF/versions/15/