【问题标题】:Jython does not resolve python imports from bundled Lib files/folders on Weblogic 10.3.5Jython 无法解析来自 Weblogic 10.3.5 上捆绑的 Lib 文件/文件夹的 python 导入
【发布时间】:2014-11-24 06:50:38
【问题描述】:

我是 Jython 和 Python 的新手,正在尝试构建一个原型,该原型利用 Python 代码从 Java 中调用。我正在开发的代码在 Jetty 和独立模式下工作(从命令行运行 java -jar),但在部署到 weblogic 时不能。

如何让 weblogic(10.3.5) server/Jython 识别 jython-standalone-2.5.4-rc1.jar 中的 Lib 文件夹?

我的 Java 代码使用 JythonObjectFactory 来调用 Python 模块,如 Jython 书中所述: http://www.jython.org/jythonbook/en/1.0/JythonAndJavaIntegration.html

Python 模块正在使用未与 jython.jar 打包的外部库,例如 csv、日志记录等,因此我使用的是 jython-standalone jar。

java 代码包含一个接口,该接口将定义第一个从 java 中调用的 py 模块的类类型。接口和输入和输出(到 python 模块)类型类在一个包结构中,如 com.abc.xpackage。并且 py 模块存在于这个包的根目录中。控制器层调用 objectfactory 并依次执行 python 代码:

        JythonObjectFactory calFactory = new JythonObjectFactory(CalcType.class, "Calculate", "Calculate");
        CalcType engine = (CalcType)calFactory.createObject();
        output = engine.execute(input);

整个代码捆绑为一个 jar 文件,该文件将成为部署在 weblogic 上的 web 应用程序的一部分。该代码是使用 maven 编译的(存储库中包含 jython 依赖项),并且在 eclipse 中包含的 Jetty 运行时上运行良好。

但是,当部署在 weblogic 上时,我收到“ImportError: no module named csv”错误。

为了分析发生了什么,我尝试在 weblogic 和独立环境/Jetty 上打印 Jython 系统状态路径。我发现的是, 在 Jetty 上,系统路径由以下部分组成:

C:\.m2\repo\org\python\jython\jython-standalone-2.5.3-rc1.jar\Lib, ____classpath__, ____pyclasspath__

在Weblogic上,默认打印系统路径如下:

____classpath__, ____pyclasspath__

我尝试使用以下代码强制包含缺少的路径:

public JythonObjectFactory(PySystemState state, Class interfaceType, String moduleName, String className) {

    String pathToAppend = new File(state.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().getPath()).getAbsolutePath()+"\\Lib";
    state.path.insert(0, new PyString(pathToAppend));
    state.path.append(new PyString(pathToAppend));
    System.out.println("Jython sys path: "+state.path);

请注意,我在不同的试验中都添加了路径。 weblogic 上的 sys 路径现在显示如下:

Jython sys path: ['C:\\wldomain\\wls135\\servers\\cgServer\\tmp\\app-1\\war\\WEB-INF\\lib\\jython-standalone-2.5.4-rc1.jar\\Lib', '__classpath__', '__pyclasspath__/', 'C:\\wldomain\\wls135\\servers\\cgServer\\tmp\\app-1\\war\\WEB-INF\\lib\\jython-standalone-2.5.4-rc1.jar\\Lib']

尽管强制使用 sys 路径,但我仍然收到 ImportError。请帮助解释为什么这在本地环境中有效,而不是在 weblogic 上,如果我缺少任何配置。为漫无边际的长帖子道歉,我不知道如何更好地解释这个问题。我将尝试根据需要包含任何代码/工件。

【问题讨论】:

  • 几个选项 - 你可以分解 jar 并指向分解目录中的 Lib 目录。一个更简单的选择是简单地将 jython jar 文件添加到顶级 Weblogic lib 目录C:\\wldomain\\wls135\\lib
  • @Display* 感谢您的建议。我尝试了这两种方法,但问题仍然存在。请注意,jython-standalone-2.5.4-rc1.jar 中的 Lib 文件夹包含 .py 模块而不是 java 类。我将 jar 和分解后的 Lib 目录都复制到 wldomain 服务器 lib 目录中,并明确指出了查看这些的路径,但没有运气。
  • 另一个想法 - 可能是 weblogic 服务器本身也在将 jython jar 加载到类路径中,当您运行时,它会选择那个(在 csv 模块之前会更旧)。似乎前置和附加可以解决它,但是......您可能想使用jconsole 连接到正在运行的服务器并查看类路径。您的方法看起来正确基于:stackoverflow.com/questions/471000/jython-and-python-modules
  • @Display* 再次感谢。通过在 weblogic 启动命令中添加 JAVA_OPTION -Dpython.path="xxx" ,其中 xxx 是上述 Lib 的位置,我终于能够使其工作。这使得 python.path 可用于 weblogic。程序中的 state.path.append/sys.path.append 从来没有让 weblogic 在运行时识别/解决这个问题。
  • 很高兴您找到了解决方案。随意发布您所做的作为答案并接受它,以便其他用户知道您找到了解决方案

标签: weblogic jython


【解决方案1】:

基于以下博客文章中的评论(由 Lassi 撰写): http://www.petervannes.nl/files/e1c3c56d15d25dcfd4adb5397a9ef71e-53.php

在将 Lib 文件夹 python.path 作为 JAVA_OPTION 显式添加到 weblogic 启动脚本后,jython 问题得到解决。

在我的情况下,我将展开的 Lib 文件夹添加到域服务器 lib,但根据我的测试,这也适用于 jython jar。以下 JAVA_OPTIONS 都有效:

-Dpython.path=C:\wldomain\wls135\lib\Lib
-Dpython.path=C:\wldomain\wls135\lib\jython-standalone-2.5.4-rc1.jar\Lib

sys.path.append 的编程方式适用于本地环境(jetty),但似乎不适用于 weblogic。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-05
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 2011-09-09
    • 2018-02-19
    相关资源
    最近更新 更多