【问题标题】:Searching for files in a jar file (Including Jython class files in a jar file to be found)查找jar文件中的文件(包括要查找的jar文件中的Jython类文件)
【发布时间】:2014-02-11 17:34:25
【问题描述】:

按照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 

下一步,我尝试将 py 目录复制到 jar 文件中,为此我也使用了 IntelliJ。

我检查了jar文件在jar文件中有py目录。您会看到 py 目录位于 jar 文件的根目录。

但是,当我执行 jar 文件时,我收到一条错误消息,提示缺少 jython 模块。

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

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

【问题讨论】:

  • 尝试将python文件放到jar文件的顶层目录下看看是否可行。
  • @daniel kullmann:它已经在顶层目录中;问题中显示的是解压的 jar 文件。
  • 我的意思是没有 py 目录,例如Host.py 直接在 zip 文件的顶层目录中

标签: java search jar intellij-idea jython


【解决方案1】:

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

根据这篇文章的提示(How to get the path of a running JAR file?),可以找到jar文件所在的路径。类文件可以在 location + "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]));
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-30
    • 2010-11-30
    • 2012-12-13
    • 2017-09-12
    • 1970-01-01
    • 2013-04-27
    • 2019-06-25
    • 1970-01-01
    相关资源
    最近更新 更多