未发现MVEL脚本引擎

时间:2019-05-06 22:25:37

标签: java jsr223 mvel

我的类路径中有一个专用的jar,

    <dependency>
        <groupId>org.mvel</groupId>
        <artifactId>mvel2</artifactId>
        <version>2.4.4.Final</version>
        <type>jar</type>
    </dependency>

该jar确实包含META-INF/services/javax.script.ScriptEngineFactory文件,该文件显示为org.mvel2.jsr223.MvelScriptEngineFactory,后者看起来确实像脚本引擎工厂。

仍然

private final ScriptEngineManager _scripting = new ScriptEngineManager(null);
....
ScriptEngine engine = _scripting.getEngineByName("mvel");

返回null。我已经检查了工厂代码,名称mvel是有效的:

https://github.com/mvel/mvel/blob/master/src/main/java/org/mvel2/jsr223/MvelScriptEngineFactory.java

我的Java在Ubuntu 18.04.2 LTS上是java-8-openjdk-amd64

我总是可以手动将mvel添加到脚本管理器,但是应该吗?目前仅发现Nashorn

1 个答案:

答案 0 :(得分:1)

脚本引擎通过包含数据的META-INF / services / javax.script.ScriptEngineFactory注册:

org.mvel2.jsr223.MvelScriptEngineFactory

首先,请确保您实际上在包装具有此文件和文本的JAR。当心打包在一个大的jar文件中可能会导致该文件被覆盖或忽略-如果这样做,该文件必须包含应用程序要引用的所有脚本引擎。找不到该文件也可能是类加载器管理不当的结果。

从Oracle: https://docs.oracle.com/javase/8/docs/api/javax/script/compact2-package-summary.html

脚本引擎发现和元数据:写入脚本API的应用程序可能对脚本引擎有特定要求。一些可能需要特定的脚本语言和/或版本,而另一些可能需要特定的实现引擎和/或版本。脚本引擎以指定的方式打包,以便可以在运行时发现引擎并查询其属性。引擎发现机制基于Jar文件规范中描述的服务发现机制。脚本引擎实现类打包在jar文件中,该jar文件包含名为META-INF / services / javax.script.ScriptEngineFactory的文本资源。对于打包在jar文件中的每个ScriptEngineFactory,此资源​​必须包括一行。 ScriptEngineManager包含getEngineFactories方法,以获取使用此机制发现的所有ScriptEngineFactory实例。 ScriptEngineFactory具有查询脚本引擎属性的方法。