如何让Jython PythonPath可靠地包含java类路径?

时间:2010-11-08 16:27:01

标签: eclipse-rcp jython pydev

问题

有没有办法可靠地确保在eclipse下运行单元测试时,python源路径编译的java类路径都被添加到Jython PythonPath中?

如果没有,是否有比向PyDev PythonPath,外部库列表添加绝对路径更好的解决方法?

背景

我在从Java类继承的Jython类上运行Jython单元测试时遇到了一个奇怪的问题。

我们有一个带有结构(简化)的eclipse RCP应用程序,如下所示:

Config project (Pydev nature only)
    scripts
        src
            classes.py
        test
            classesTest.py

Core project (Both Java & Pydev natures)
    scripts
    src
        baseClass.java
    classes
        baseClass.java

Library project (Both Java & Pydev natues, but no Jython scripts)
    src
        interface.java
    classes
        interface.class

classes.py我导入baseClass,其中实现interface中定义的interface.java。然后我创建一个继承自baseClass

的Jython类

在我的classesTest.py中,我导入类并定义单元测试。

当我尝试使用“Project explorer> classesTest.py> Run as> Jython unit-test”运行单元测试时出现问题:

  1. 有时无法找到baseClass(我认为它失败了ImportError,但我现在无法重现这一点。)
  2. 有时会找到baseClass,但找不到interface,因此java.lang.NoClassDefFoundError失败。
  3. 如果我在测试模块的开头pprint sys.path,那么我可以看到:

    1. 虽然core/scripts位于python路径上,但core/classeslibrary/classes都不在路径上。
    2. core/scriptscore/classes都在python路径上,但library/classes仍然没有。
    3. 有时候,很少将这两个类路径添加到python路径中,并且单元测试工作正常,没有下面的解决方法。不幸的是,我还没有弄清楚如何重现这一点,并且可以看到源代码树中的文件在工作和不工作之间没有区别。

      当前解决方法

      我目前的解决方法是明确地为library/classescore/classes明确添加“外部库”。不幸的是,它们似乎必须是绝对路径,这意味着我必须为我使用的每个主干,分支或计算机设置不同的路径。因此,我不想将这些提交到版本控制中,每次都要设置它们是一件痛苦的事。

      注释

      请注意,Config项目仅引用核心项目,但显式引用库项目对类路径没有任何影响。

      此外,在尝试找到一种可靠的方法来重现这个问题时,我让其他库莫名其妙地从python路径中消失,然后就像神秘地重新出现一样,最近的例子是Mock!

      更新

      我最近没有看到这个问题(目前正在使用Eclipse 3.7.1和PyDev 2.2.2),所以它可能是我当时使用的Eclipse / PyDev组合的一个例子。

2 个答案:

答案 0 :(得分:1)

对于java项目,您必须将包含.class文件的文件夹显式添加到PYTHONPATH。

推荐的组织是:

java_project / bin< - 此文件夹应设置为PyDev中的源文件夹(要添加到PYTHONPATH)。 java_project / src< - 此文件夹应添加到jdt类路径中,但不应在PyDev中有任何引用

python_project / src< - 此文件夹应设置为PyDev中的源文件夹(将添加到PYTHONPATH中)。

python_project应该引用java_project。

请参阅http://pydev.org/manual_101_project_conf2.html的最后一部分作为参考。

答案 1 :(得分:0)

我有类似的问题。最近解决了相应修改Jython注册表文件中的python.path字段。

看起来Pydev插件无法修改sys.path以便能够从Eclipse中的Java项目导入Python模块。

Adding in a python module to the sys.path for a Java project in pydev, Eclipse

的更多详情