9

在我的 Java 应用程序中,一个重要的小功能是能够根据音频文件的元数据(例如专辑/艺术家-标题)重命名音频文件,并且使用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;
}
4

2 回答 2

7

您可以在任何 JVM 上运行 GraalVM 的 JavaScript 引擎,作为从 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)。

于 2020-06-08T22:10:26.760 回答
4

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

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

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

于 2021-03-04T05:21:30.737 回答