如何在 Java 15 以后继续使用 Javascript

Pau*_*lor 8 java nashorn java-14 java-15

在我的 Java 应用程序中,一个重要的小功能是能够根据音频文件的元数据(例如专辑/艺术家 -title)重命名音频文件,并且使用Javascript指定掩码,这使得重命名功能非常灵活和强大。

我知道 Javascript 已被弃用,但现在看来它实际上将从 Java 15 中删除。这种功能的丢失对我来说可能是一个主要问题,所以我问,即使它被正式删除,我是否可以继续在 Java 15 应用程序中使用 Javascript,即它是否可以作为 opensrc 插件使用,我可以在我自己的风险。开发在 Ecmascript 5.1 停止的事实对我来说不是一个主要问题。

有人提到使用GraalVM,但没有解释如何执行此操作,我认为这不适合我的场景,特别是我的应用程序可用于某些 32 位Arm环境,而 GraalVM 不可用于 32 位。

我已经从 Java 11 转移到 Java 14 以解决其他一些问题,所以我不能真正回到 Java 11,而且由于 Java 14 不是LTS版本,我不能真正坚持使用 Java 14 很长一段时间。

这是我的大部分 Javascript 代码

try
{
    mask = includeUserDefinedFunctions(mask);
    ScriptEngine engine = manager.getEngineByName("JavaScript");
    for(SongFieldName next:SongFieldName.values())
    {
        if(next.getScriptVar()!=null && next.getSongFieldKey()!=null)
        {  
            engine.put(next.getScriptVar(), cleanValue(song.getFieldValueSpaceSeparatedOrEmptyString(next.getSongFieldKey()), song));
        }
    }
    String result = (String)engine.eval(mask);
    return result;
}
catch(ScriptException se)
{
    throw se;
}
Run Code Online (Sandbox Code Playgroud)

Zhe*_*lov 7

您可以使用 Nashorn 的独立版本: https: //github.com/openjdk/nashorn

Nashorn 是一个 JPMS 模块,因此请确保它及其传递依赖项(Nashorn 依赖于多个 ASM JAR)位于应用程序的模块路径上,或者适当地添加到模块层,或者以其他方式配置为模块。

虽然独立 Nashorn 主要与 Java 15 及更高版本一起使用,但它也可以与 也具有内置版本 Nashorn 的Java 版本 11 至 14 一起使用。有关两个版本都存在时的使用详细信息,请参阅此页。


Ole*_*jev 6

您可以在任何 JVM 上运行 GraalVM 的 JavaScript 引擎,作为从 Maven 中心提取的一堆依赖项。这是一个例子:https : //github.com/graalvm/graaljs/blob/master/docs/user/RunOnJDK.md

如果没有 GraalVM 编译器,它会更慢,因为 GraalVM 的语言实现框架需要来自编译器的某些 api,而其他 JIT 中没有。

如果您考虑迁移应用程序以使用 GraalVM 的 JavaScript,如果您使用某些 Nashorn 功能,它可能无法在代码之外运行,请考虑从--nashorn-compatibility-mode(这里有更多详细信息:https : //github.com/graalvm/ graaljs/blob/master/docs/user/NashornMigrationGuide.md)。

  • 开发者倡导者,但在团队中,所以我会尽力回答问题。1. 它支持 ES6(实际上 20.1 默认启用 ES 2020 功能):https://kangax.github.io/compat-table/es6/ 2. GraalVM 语言支持需要创建一个解释器,该解释器将非常有效地进行 JIT 编译。这比手动创建优化编译器要容易得多。我认为,维护工作的努力是 JEP 中宣布弃用 Nashorn 的主要原因之一。3. 不知道,OpenJDK 邮件列表有更好的问题。4. 老实说不知道,最好在 GitHub 问题中提问 github.com/oracle/graal (4认同)
  • 我还添加了一行和一个关于 nashorn 兼容性模式的链接,我认为这可能会简化迁移,它不在最初的问题中,但却是非常有用的信息。 (2认同)