以下は、ハイブリッド 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;
}
}