本当に dateutils Python ライブラリを使用したい場合は、方法があります。少し不便ですが、最終的にはコピーではなくオリジナルを使用できます。
Jythonを使用して dateutils ライブラリを実行できます。欠点は、Java から元の datutils クラスを直接使用できないことです。Java インターフェースを実装するラッパー Jython クラスを実装する必要があります。
ただし、最初に の独自のカスタム コピーを準備する必要がありますjython.jar
。
Jython はさまざまな方法で使用できます。最初の方法は、Python に似た Jython を独自のディレクトリにインストールすることです。これで普通の Python のように Jython を使えます。Jython スクリプトを実行したり、セットアップ ツールを介してライブラリをインストールしたりできます。
もう 1 つの方法は、スタンドアロン を使用することjython.jar
です。スタンドアロンjython.jar
には、Jython システム全体が含まれています。この JAR を使用して Jython スクリプトを実行することもできます。しかし、Jython システム全体を 1 つの JAR にパックする主な目的は、それを Java アプリケーションに組み込み、Java から Jython/Python コードを呼び出す (またはその逆) ことです。
dateutils ライブラリは、Python/Jython 標準ライブラリの一部ではありません。なのでそのままでは使えません。独自のディレクトリを作成するjython.jar
には、まず Jython を独自のディレクトリにインストールする必要があります。
1. Jython
のダウンロード Jython ダウンロード ページに移動し、2.5.3 Jython インストーラー JAR をダウンロードします。ベータ ステータスでは、より高いバージョン番号を使用しないでください。セットアップ ツールがこれらのベータ バージョンで動作するかどうかは不明です。
2. ディレクトリに Jython をインストールする
実行java -jar jython-installer-2.5.3.jar
し、標準のインストール タイプを選択して、ディレクトリにインストールします~/jython2.5.3
。
3. セットアップ ツールのインストールhttp://peak.telecommunity.com/dist/ez_setup.pyを
ダウンロードして実行します~/jython2.5.3/bin/jython ez_setup.py
。Jython ブックの付録 Aを参照してください。
4. ライブラリのインストールdateutils
ライブラリ
の 1.5 バージョンをダウンロードしdateutils
ます: http://labix.org/download/python-dateutil/python-dateutil-1.5.tar.gz。このバージョンは Python < 3.0 用です。アーカイブを解凍し、ビルドしてインストールします。
~/jython2.5.3/bin/jython setup.py build
~/jython2.5.3/bin/jython setup.py install
その後、Jython インストールには、datetuils ライブラリーが含まれているはず~/jython2.5.3/Lib/site-packages/python_dateutil-1.5-py2.5.egg/dateutil
です。
Jython インタープリターを実行してインストールを確認し、サンプルの日付ストリングを解析できます。
~$ ~/jython2.5.3/bin/jython
Jython 2.5.3 (2.5:c56500f08d34+, Aug 13 2012, 14:48:36)
[OpenJDK 64-Bit Server VM (Sun Microsystems Inc.)] on java1.6.0_27
Type "help", "copyright", "credits" or "license" for more information.
>>> from dateutil.parser import *
>>> parse('Oct 5, 2013')
datetime.datetime(2013, 10, 5, 0, 0)
>>>
それで、これまでのところうまくいきます。これで、dateutils ライブラリが Jython と互換性があることを確認できました。
5. デフォルトのスタンドアロン jython.jar を作成する
Jython インストーラーをもう一度実行し、インストール タイプとして [スタンドアロン (呼び出し可能な .jar ファイル)] を選択します。その後、結果の JAR ファイル (すべての ZIP 解凍ツールを使用できます) をディレクトリ (例: ~/jar) に解凍します。
6. dateutils ライブラリを jython.jar にインストールします。~/jython2.5.3/Lib/site-packages/python_dateutil-1.5-py2.5.egg
最初に試みたのは、ディレクトリを
にコピーすることでした~/jar/Lib/site-packages
。ただし、これは組み込みモードでは機能しません。ディレクトリが の直下になるように にコピー~/jython2.5.3/Lib/site-packages/python_dateutil-1.5-py2.5.egg/dateutil
する必要があります。~/jar/Lib
dateutil
~/jar/Lib
7. カスタム jython.jar を作成
する 結果を zip して~/jar
、名前を付けますjython.jar
。を実行してみてくださいjava -jar jython.jar
。これにより、 から Jython インタープリターが開始されますjython.jar
。dateutils で日付を解析してみてください。
カスタムをクラスパスに配置するだけで、dateutils ライブラリを含む Jython システム全体を Java プロジェクトに含めることができるようになりjython.jar
ました。
8. Java インターフェースの
作成 Java プロジェクトで Java インターフェースを作成します。これは、Java と Jython の世界の間の架け橋として機能します。後で、このインターフェースを実装する Jython クラスを作成します。Java コードから、このインターフェースを介してこの Jython クラスを使用します。
この例では、インターフェイスを呼び出してパッケージDateutilParser
に入れます。dateutilstest
package dateutiltest;
import java.util.Date;
public interface DateutilParser {
Date parsedate(String s);
}
したがって、唯一のメソッドは文字列をパラメーターとして受け入れ、java.util.Date
. ここでは、Java 側にとって特別なことは何もありません。
9. Jython とのインターフェースの実装
クラスパスのルート (Eclipse ではディレクトリのルート) にファイル MyDateParser.py を作成しますsrc
。
import java.util.Date as Date
import java.util.GregorianCalendar as GregorianCalendar
import dateutiltest.DateutilParser as DateutilParser
from dateutil.parser import *
class MyDateParser(DateutilParser):
def parsedate(self, s):
d = parse(s)
g = GregorianCalendar(d.year, d.month, d.day)
return g.getTime()
最初に、Java クラスDate
とGregorianCalendar
. Jython 内で Java クラスを使用することは問題なく、簡単です。次に、Java インターフェイスをインポートしますDateutilParser
。最後のインポートは、dateutils パーサー クラス用です。MyDateParser
次に、 を実装する Jython クラスを作成しますDateutilParser
。このparsedate
メソッドでは、最初に dateutil の関数を使用して文字列から日付を作成し、インスタンスをparse()
介してオブジェクトに変換します。GregorianCalendar
java.util.Date
10. MyDateParser インスタンスを作成する
パズルの最後の部分はDateutilParserFactory
、Jython インタープリターを使用してインスタンスを作成し、インターフェースMyDateParser
を介してインスタンスへのアクセスを提供するJava クラスです。DateutilParser
package dateutiltest;
import org.python.core.PyObject;
import org.python.util.PythonInterpreter;
public class DateutilParserFactory {
private PyObject parserClass;
/**
* Create a new PythonInterpreter object, then use it to
* execute some python code. In this case, we want to
* import the python module that we will coerce.
*
* Once the module is imported than we obtain a reference to
* it and assign the reference to a Java variable
*/
public DateutilParserFactory() {
final PythonInterpreter interpreter = new PythonInterpreter();
interpreter.exec("from MyDateParser import MyDateParser");
parserClass = interpreter.get("MyDateParser");
}
/**
* The create method is responsible for performing the actual
* coercion of the referenced python module into Java bytecode
*/
public DateutilParser create() {
PyObject buildingObject = parserClass.__call__();
return (DateutilParser) buildingObject.__tojava__(DateutilParser.class);
}
}
詳細については、Jython ブックの第 10 章「Using Jython Within Java Applications」を参照してください。
11. 使用する
この例ではMain
、機能を示すためにクラスを作成しました。
package dateutiltest;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Main {
public static void main(String[] args) {
final DateutilParserFactory fac = new DateutilParserFactory();
final DateutilParser parser = fac.create();
final Date d = parser.parsedate("Oct 5, 2013");
final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
System.out.println(sdf.format(d));
}
}
出力は次のとおりです。
2013-11-05