Eclipse插件项目可以引用Eclipse PyDev项目代码中基于Jython的Java类吗?

时间:2012-10-24 18:36:56

标签: eclipse-plugin jython pydev

以下解释了我尝试制作混合PyDev / Eclipse插件项目的尝试。我后来发现,即使我创建一个单独的PyDev项目,我也不能通过在插件项目中引用项目来使用我的基于PyDev Jython的Java类。另一方面,我可以在一个不是插件项目的单独项目中使用PyDev Java类。

我有一个eclipse插件,我也设置为PyDev项目。我是根据Jython Book v1.0 documentation chapter 10chapter 11构建的。

当我如下所示运行Main时,我看到了

  

1 BUIDING-A 100 MAIN ST

当我尝试在设置为PyDev项目的插件项目中执行相同操作时(右键单击project-> Pydev->设置为Pydev项目),我得到一个ImportError:没有命名的模块建造。看起来该项目的插件性质胜过该项目的PyDev性质。

有什么想法吗?

我已将Main功能放在下面,然后是一些支持代码。

package org.jython.book;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.jython.book.interfaces.BuildingType;
import org.jython.book.util.JythonObjectFactory;

public class Main {

    public static void main(String[] args) {

    // Obtain an instance of the object factory
    JythonObjectFactory factory = JythonObjectFactory.getInstance();

    // Call the createObject() method on the object factory by
    // passing the Java interface and the name of the Jython module
    // in String format. The returning object is casted to the the same
    // type as the Java interface and stored into a variable.
    BuildingType building = (BuildingType) factory.createObject(
        BuildingType.class, "Building");
    // Populate the object with values using the setter methods
    building.setBuildingName("BUIDING-A");
    building.setBuildingAddress("100 MAIN ST.");
    building.setBuildingId(1);
    System.out.println(building.getBuildingId() + " " + building.getBuildingName() + " " +
        building.getBuildingAddress());

    }

}

这里的JythonObjectFactory应该与[Jython Book v1.0文档第10章] [3]中的内容完全相同,当然还有错别字: - )

package mypackage.files.util;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.python.core.PyObject;
import org.python.util.PythonInterpreter;

/**
 * Object factory implementation that is defined
 * in a generic fashion.
 *
 */

public class JythonObjectFactory {
    private static JythonObjectFactory instance = null;
    private static PyObject pyObject = null;

    protected JythonObjectFactory() {

    }
    /**
     * Create a singleton object. Only allow one instance to be created
     */
    public static JythonObjectFactory getInstance(){
        if(instance == null){
            instance = new JythonObjectFactory();
        }

        return instance;
    }

    /**
     * The createObject() method is responsible for the actual creation of the
     * Jython object into Java bytecode.
     */
    public static Object createObject(Object interfaceType, String moduleName){
        Object javaInt = null;
        // Create a PythonInterpreter object and import our Jython module
        // to obtain a reference.
        PythonInterpreter interpreter = new PythonInterpreter();
        interpreter.exec("from " + moduleName + " import " + moduleName);

        pyObject = interpreter.get(moduleName);

        try {
            // Create a new object reference of the Jython module and
            // store into PyObject.
            PyObject newObj = pyObject.__call__();
            // Call __tojava__ method on the new object along with the interface name
            // to create the java bytecode
            javaInt = newObj.__tojava__(Class.forName(interfaceType.toString().substring(
                        interfaceType.toString().indexOf(" ")+1,
                        interfaceType.toString().length())));
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(JythonObjectFactory.class.getName()).log(Level.SEVERE, null, ex);
        }

        return javaInt;
    }

}

1 个答案:

答案 0 :(得分:1)

如果您在项目中添加了多个性质,则Eclipse将调用与这些项目相关的所有构建器。因此,如果构建失败并出现一些与PyDev相关的错误消息,这实际上表明PyDev部分存在问题,而不是PDE问题。也许您缺少该项目的一些其他文件或项目设置?

一般来说,你应该避免在一个项目中混合多个性质。这通常会带来麻烦,因为大多数构建者和其他扩展者都希望他们是“唯一的”修补项目。几乎所有涉及多个性质的用例都可以通过两个不同的项目更容易地解决,其中一个项目引用另一个项目(然后可以访问该引用项目的资源)。请参阅项目属性 - >参考项目