【发布时间】:2018-10-15 22:12:42
【问题描述】:
我创建了一个默认的 Maven Java 项目并添加了以下依赖项:
<dependency>
<groupId>org.python</groupId>
<artifactId>jython</artifactId>
<version>2.7.0</version>
</dependency>
然后我创建了一个包src/main/java/mypkg并添加了这个类:
package mypkg;
import javax.script.*;
class JythonMinimalTest {
public static void main(String[] args) throws Exception {
String engineName = "python";
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName(engineName);
if (engine == null) {
System.err.println("ERROR: `" + engineName + "` not available.");
System.err.println("Available engines: ");
for (ScriptEngineFactory factory: manager.getEngineFactories()) {
System.err.println(factory);
System.err.println("names:");
for (String name: factory.getNames()) {
System.err.println(" " + name);
}
}
System.exit(999);
}
engine.eval("print('hello, world')");
}
}
当我使用exec:java 运行它时,
mvn exec:java -Dexec.mainClass=mypkg.JythonMinimalTest
我得到以下神秘的输出:
ERROR: `python` not available.
Available engines:
org.python.jsr223.PyScriptEngineFactory@2b0e6c89
names:
python
jython
jdk.nashorn.api.scripting.NashornScriptEngineFactory@46618cb8
names:
nashorn
Nashorn
js
JS
JavaScript
javascript
ECMAScript
ecmascript
经理返回null,但随后在下一行列出了可用脚本引擎中的python/jython。
Nashorn 以完全相同的方式工作得很好。我在使用 Jython 时做错了什么?
【问题讨论】:
-
您使用的是什么版本的 Java?
-
@ElliottFrisch maven 同时使用 1.8:
<maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target>,java 本身也是1.8.0。 -
如果您使用
jython-standalone而不是jython作为 artifactId 会发生什么(参见 Luis Muñoz 的评论)? -
@mzjn 实际上,使用 jython-standalone 2.7.1,我不需要任何
Option.loadSite=falsehack,它可以立即按预期工作。请注意,jython-standalone.jar占用 40MB 而不是 30MB。此解决方案在{Andrew 在 {Luis Muñoz 链接的问题}} 中提到的问题:whats-the-difference-between-jython-standalone-2-7-0-jar-and-jython-2-7-0-jar,但没有公认的答案...