3

私は、jar ファイルとして配布されるいくつかの Java パッケージを開発しています。いくつかの新しい要件により、jthon でいくつかの新しい機能をプログラムする必要があります。これらはおそらく、多くの個別の jthon ファイルに分散されたかなりの量のコードをカバーするでしょう。

パッケージごとに 1 つの jar ファイルの配布を続けたいと考えています。少し検索すると、残念ながらどちらもあまり良くない2つのアプローチが得られました。

1) jythonc: 私は jython 2.5.1 を使用しているため、jythonc はディストリビューションに含まれなくなりました。その上、これが私の jython コードに課す制限が好きではありません。

2) すべてを jython.jar ファイルと一緒にパッケージ化します。残念ながら、これは不可能です。私のコード パッケージを使用しているすべての人は、環境内に既に jython.jar ファイルを持っています (そして、それらの多くは異なるバージョンを使用しています)。つまり、私のパッケージは Python コアなしで配布する必要があります。代わりに、ターゲット システムのクラスパスにあることを信頼できます。

jython.jar ファイルを変更せずに、すべての Java および jython コードを 1 つの jar 内にパッケージ化する別の方法はありますか?

4

1 に答える 1

1

私はついに私の問題の解決策を見つけました。たぶん、これは他の誰かにとっても興味深いものです。念のために言っておきますが、これは、自己完結型アプリケーションではなく、Java を上に置いた混合 Java/Jython パッケージを対象としており、顧客に提供されます。

1) すべての jython ソースは、ツール「jar」(またはその他の zip ツール) を使用して、jar ファイル内の最上位の別のフォルダーに配置されます。フォルダー「Lib」を使用しました。

2) Java からの jython コードへのアクセスは、シングルトンとしてモデル化されたオブジェクト ファクトリ クラスを使用して行われます (ここで説明されているものと同様)。jython から Java へのアクセスは、完全なパッケージ名だけで簡単に機能します。

3)私が使用するオブジェクトファクトリのコンストラクタで

String jarPath = myObjectFactory.class.getProtectionDomain().getCodeSource().getLocation() .getPath();

コード内からjarファイルの場所を特定します。

4) jar ファイル内の「Lib」フォルダーを、次を使用して jython モジュールのルックアップ パスに追加します。

PySystemState newState = new PySystemState(); newState.path.insert(0,Py.newString(jarPath + java.io.File.separator + "Lib")); Py.setSystemState(newState);

jython.jar ファイルがクラスパスに含まれている限り、これは機能します。

于 2012-12-05T14:52:54.507 に答える