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

How can I continue to use Javascript in Java 15 onwards

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

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

有人提到使用 GraalVM 但没有解释如何做到这一点,我认为这不适合我的场景,特别是我的应用程序在某些 32 位 Arm 环境和 GraalVM 不适用于 32 位。

我已经从 Java 11 转移到 Java 14 来解决一些其他问题,所以我不能真的回到 Java 11,因为 Java 14 不是 LTS 版本 我无法长期坚持使用 Java 14。

这是我的大部分Java脚本代码

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;
}

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

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

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

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

Nashorn is a JPMS module, so make sure it and its transitive dependencies (Nashorn depends on several ASM JARs) are on your application's module path, or appropriately added to a module layer, or otherwise configured as modules.

While standalone Nashorn is primarily meant to be used with Java 15 and later versions, it can also be used with Java versions 11 to 14 that have a built-in version of Nashorn too. See this page for details on use when both versions are present.