Python ファイルを jar で配布するための現在の最適な手法については、Jython の wiki の次の記事で詳しく説明しています: http://wiki.python.org/jython/JythonFaq/DistributingJythonScripts
あなたの場合、Jython をインストールしたときに取得した jython.jar ファイルを取得し、Jython Lib ディレクトリをその中に圧縮してから、.py ファイルを圧縮してから、__run__.py
起動ロジックを含むファイルを追加することをお勧めします (このファイルは Jython によって特別に扱われ、"java -jar" で jar を呼び出したときに実行されるファイルになります)。
このプロセスは、本来あるべきよりも明らかに複雑であるため、私たち (Jython 開発者) は、これらのタスクを自動化する優れたツールを考え出す必要がありますが、現時点ではこれらが最良の方法です。以下では、上記の記事の下部にあるレシピをコピーして (問題の説明に合わせて少し変更しています)、解決策を理解してもらいます。
基本的な jar を作成します。
$ cd $JYTHON_HOME
$ cp jython.jar jythonlib.jar
$ zip -r jythonlib.jar Lib
他のモジュールを jar に追加します。
$ cd $MY_APP_DIRECTORY
$ cp $JYTHON_HOME/jythonlib.jar myapp.jar
$ zip myapp.jar Lib/showobjs.py
# Add path to additional jar file.
$ jar ufm myapp.jar othermanifest.mf
__run__.py
モジュールを追加します。
# Copy or rename your start-up script, removing the "__name__ == '__main__'" check.
$ cp mymainscript.py __run__.py
# Add your start-up script (__run__.py) to the jar.
$ zip myapp.jar __run__.py
# Add path to main jar to the CLASSPATH environment variable.
$ export CLASSPATH=/path/to/my/app/myapp.jar:$CLASSPATH
MS Windows では、CLASSPATH 環境変数を設定する最後の行は次のようになります。
set CLASSPATH=C:\path\to\my\app\myapp.jar;%CLASSPATH%
または、再び MS Windows で、コントロール パネルとシステム プロパティを使用して CLASSPATH 環境変数を設定します。
アプリケーションを実行します。
$ java -jar myapp.jar mymainscript.py arg1 arg2
または、起動スクリプトを jar に追加した場合は、次のいずれかを使用します。
$ java org.python.util.jython -jar myapp.jar arg1 arg2
$ java -cp myapp.jar org.python.util.jython -jar myapp.jar arg1 arg2
$ java -jar myapp.jar -jar myapp.jar arg1 arg2
二重の -jar はちょっと面倒なので、それを避けてより快適にしたい場合:
$ java -jar myapp.jar arg1
このようなものが将来の Jython に組み込まれるまで、もう少し作業を行う必要があります [更新: JarRunner は Jython 2.5.1 の一部です]。__run__.py
を自動的に検索して実行する Java コードを次に示します。これがこのクラスでの私の最初の試みであることに注意してください。改善が必要な場合はお知らせください。
package org.python.util;
import org.python.core.imp;
import org.python.core.PySystemState;
public class JarRunner {
public static void run(String[] args) {
final String runner = "__run__";
String[] argv = new String[args.length + 1];
argv[0] = runner;
System.arraycopy(args, 0, argv, 1, args.length);
PySystemState.initialize(PySystemState.getBaseProperties(), null, argv);
imp.load(runner);
}
public static void main(String[] args) {
run(args);
}
}
このコードを org.python.util パッケージに入れました。これは、将来の Jython に含めることを決定した場合にそこに移動するためです。コンパイルするには、jython.jar (または myapp.jar) を次のようにクラスパスに入れる必要があります。
$ javac -classpath myapp.jar org/python/util/JarRunner.java
次に、JarRunner.class を jar に追加する必要があります (クラス ファイルは org/python/util/JarRunner.class にある必要があります)。「org」ディレクトリで jar を呼び出すと、jar へのパス全体が取得されます。
$ jar uf org
これをマニフェストの更新に使用するファイルに追加します。適切な名前は manifest.txt です。
Main-Class: org.python.util.JarRunner
次に、jar のマニフェストを更新します。
$ jar ufm myapp.jar manifest.txt
これで、次のようにアプリを実行できるはずです。
$ java -jar myapp.jar