【问题标题】:Why am I failing to resolve public java objects in jython when using "from javax.mail import *"?为什么在使用“from javax.mail import *”时无法解析 jython 中的公共 java 对象?
【发布时间】:2012-03-01 20:10:35
【问题描述】:

我不确定这是一个 jython 错误还是对使用 jython 2.5.2 导入 java 包/类的一些细微差别的误解。

我有一个从 java 执行 jython 脚本的 jython 类。其中一个脚本只是发送邮件。

jython 脚本代码片段:

from javax.mail import *
from javax.mail.internet import *
from java.util import Properties

props = Properties()
props.put("mail.smtp.host", "path.mydomain.com")
session = Session.getInstance(props,None) # Session can't be resolved

所以我在尝试解析位于 javax.mail.Session 的 Session 时遇到了异常,并且应该被“from javax.mail import * statement”覆盖

执行 jython 的 Java 类看起来有点像这样:

static {
    PythonInterpreter.initialize(System.getProperties(), new Properties(), new String[0]);
}

void run(String scriptPath){
    String script; 
    // script is read into this string here from path

    PythonInterpreter python = new PythonInterpreter(null, new PySystemState());
    try (
        python.exec(script);
    ) catch (PyException pyEx){
        // catch
    }
}

奇怪的是,如果我执行另一个带有显式导入的 jython 脚本,比如

from javax.mail import Session

那么它工作正常,但它现在也能够从以前的脚本解析 Session。

我在 maven 存储库版本 2.5.2 中使用来自 org.python 的 jython-standalone。这段代码在 2.1 中似乎工作得很好。当我使用“import *”时,也许它最初无法创建包装器?

(我知道出于性能原因我应该有明确的导入,但是这个软件会执行其他人的脚本,所以我正试图让它同时工作。)

【问题讨论】:

  • “我知道出于性能原因我应该有明确的导入” - 这是错误的。删除通配符导入不会获得任何性能。你只会让你的代码更容易理解。
  • 在《Jython Essentials》一书第 81 页中,作者提到 Jython 将遍历并为您从中导入 * 的包中的所有类创建包装器,并将它们绑定在当前范围和包中命名空间。但是,这些类实际上是延迟加载的。
  • 好吧,从 Jython 的角度来看可能很糟糕,但从 Java 的角度来看绝对不是 :)

标签: java jython embedded-script


【解决方案1】:

经过大量搜索,我发现这种行为实际上是一个错误:

http://bugs.jython.org/issue1383

【讨论】:

    猜你喜欢
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 2015-02-01
    • 2021-10-08
    • 1970-01-01
    相关资源
    最近更新 更多