在Using Jython Within Java Applications之后,我可以集成Java和Jython(Java方法可以调用python脚本)。 python代码位于py
目录中。 Jython使用sys.path.append("py")
命令来查找Jython脚本。
然后,我尝试将所有文件集成到一个jar文件中。
对于前一步,我可以生成一个jar文件,并将py目录与jar文件一起复制,并且工作正常。我使用IntelliJ IDEA生成jar文件。
│ └── py
│ ├── Context$py.class
│ ├── Context.py
│ ├── Host$py.class
│ └── Host.py
├── aggregationPython.jar <-- Generated jar file
对于下一步,我尝试复制jar文件中的py目录,我也使用了IntelliJ。
我检查了jar文件在jar文件中有py目录。你看到py目录位于jar文件的根目录下。
但是,当我执行jar文件时,我收到一条错误消息,指出jython模块丢失了。
> java -jar aggregationPython.jar
Exception in thread "main" ImportError: No module named Host
可能有什么问题?我假设py目录可以存储在jar文件中,就像它在jar文件外面找到一样。这个假设有什么问题?
答案 0 :(得分:0)
Jython类文件位于jar文件中,Jython的搜索路径并不关心它们是否在jar文件中。我们所需要的只是找到Jython类的位置,让Jython知道它。
从这篇文章(How to get the path of a running JAR file?)的提示中,可以找到jar文件所在的路径。类文件可以在位置+“py”目录中找到。
出于开发目的,还应指定源目录中的Jython源代码(“src / py”)。
String runningDir = Simulate.class.getProtectionDomain().getCodeSource().getLocation().getPath();
String jarPointer = "py";
String joinedPath = new File(runningDir, jarPointer).toString();
String pythonSrcPath = "/Users/smcho/code/PycharmProjects/aggregator/src";
JythonObjectFactory.setupPath(new String[]{joinedPath, "src/py"});
在此修改之后,Jython可以正确地找到类。
这是用于设置Jython搜索路径的setupPath
方法。
public static void setupPath(String[] paths)
{
PythonInterpreter interpreter = new PythonInterpreter();
interpreter.exec("import sys;");
for (int i = 0; i < paths.length; i++) {
interpreter.exec(String.format("sys.path.append(\"%s\")", paths[i]));
}
}