在jar文件中搜索文件(在要找到的jar文件中包含Jython类文件)

时间:2014-02-11 17:34:25

标签: java search jar intellij-idea jython

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文件的根目录下。

enter image description here

但是,当我执行jar文件时,我收到一条错误消息,指出jython模块丢失了。

> java -jar aggregationPython.jar 
Exception in thread "main" ImportError: No module named Host

可能有什么问题?我假设py目录可以存储在jar文件中,就像它在jar文件外面找到一样。这个假设有什么问题?

1 个答案:

答案 0 :(得分:0)

Jython类文件位于jar文件中,Jython的搜索路径并不关心它们是否在jar文件中。我们所需要的只是找到Jython类的位置,让Jython知道它。

从这篇文章(How to get the path of a running JAR file?)的提示中,可以找到jar文件所在的路径。类文件可以在位置+“py”目录中找到。

出于开发目的,还应指定源目录中的Jython源代码(“src / py”)。

enter image description here

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]));
    }
}