Jython不能解决Weblogic 10.3.5上捆绑的Lib文件/文件夹中的python导入问题

时间:2014-11-24 06:50:38

标签: weblogic jython

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

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

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

Python模块使用的是外部库,如csv,logging等,它们没有与jython.jar一起打包,因此我使用的是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:没有名为csv&#34的模块;错误。

为了分析正在发生的事情,我尝试在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上工作,如果有任何配置我缺少。为漫无边际的长篇帖子道歉,我不知道如何更好地解释问题。我会尝试根据需要包含任何代码/工件。

1 个答案:

答案 0 :(得分:0)

根据以下博文中的评论(Lassi): http://www.petervannes.nl/files/e1c3c56d15d25dcfd4adb5397a9ef71e-53.php

在将web文件夹python.path显式添加到weblogic启动脚本中作为JAVA_OPTION后,解决了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。