目前在jar中分发Python文件的最佳技术方法已在Jython的维基上详细介绍:
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
模块:
$ cp mymainscript.py __run__.py
$ zip myapp.jar __run__.py
$ export CLASSPATH=/path/to/my/app/myapp.jar:$CLASSPATH
在MS Windows上,最后一行设置CLASSPATH环境变量的代码应该是这样的:
set CLASSPATH=C:\path\to\my\app\myapp.jar;%CLASSPATH%
或者,在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的一部分]。以下是一些Java代码,它会自动查找__run__.py
文件并运行它。请注意,这是我第一次编写这个类。如果需要改进,请让我知道!
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文件的清单(manifest):
$ jar ufm myapp.jar manifest.txt
现在,您应该能够像这样运行您的应用程序:
$ java -jar myapp.jar
__main__.py
而不是__run__.py
? - Justin