1

以下は、ハイブリッド PyDev/Eclipse プラグイン プロジェクトを作成しようとする試みについて説明しています。その後、別の PyDev プロジェクトを作成しても、プラグイン プロジェクトでそのプロジェクトを参照することによって、PyDev Jython ベースの Java クラスを使用できないことがわかりました。一方、プラグイン プロジェクトではない別のプロジェクトで PyDev Java クラスを使用できます。

PyDev プロジェクトとしても設定した Eclipse プラグインがあります。Jython Book v1.0 documentation chapter 10およびchapter 11に基づいて構築しました。

以下に示すように Main を実行すると、次のように表示されます

1棟-A 100 MAIN ST

PyDev プロジェクトとして設定されているプラ​​グイン プロジェクト内で同じことを実行しようとすると (プロジェクトを右クリック -> Pydev -> Pydev プロジェクトとして設定)、ImportError: no module named Building というメッセージが表示されます。プロジェクトのプラグインの性質が、プロジェクトの 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());

    }

}

これは、[Jython Book v1.0ドキュメンテーションの第10章][3]にあるものとまったく同じであるはずのJythonObjectFactoryです。もちろん、タイプミスは修正されています:-)

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;
    }

}
4

1 に答える 1

1

プロジェクトに複数の性質を追加すると、それらのプロジェクトに関連するすべてのビルダーが Eclipse によって呼び出されます。そのため、ビルドが PyDev 関連のエラー メッセージで失敗した場合、これは実際には PDE ではなく PyDev 部分に問題があることを示しています。そのプロジェクトの追加ファイルまたはプロジェクト設定が不足している可能性がありますか?

一般的に言えば、1 つのプロジェクトに複数の性質を混在させることは避けるべきです。ほとんどのビルダーやその他の拡張機能は、プロジェクトをいじくり回すのは「唯一無二」であることを期待しているため、これはしばしば問題につながります。また、複数の性質が関係するほとんどすべてのユース ケースは、2 つの異なるプロジェクトを用意することで、より簡単に解決できます。この場合、一方のプロジェクトが他方のプロジェクトを参照します (そして、その参照されたプロジェクトのリソースにアクセスできます)。そのためには、プロジェクト プロパティ ->参照プロジェクトを参照してください。

于 2012-10-25T11:25:05.707 に答える