14

我正在尝试将 jython 程序打包到一个可执行 jar 中,用户只需双击即可运行,而无需提前安装 jython。最终,我想包含一个我用 jar 编写的附加库,但目前我只是想打包一个简单的程序并让它从 jar 中运行。

我已尝试按照此处“使用 Jar 方法”部分中的 jar 说明进行操作:Jython 常见问题解答:使用 Jar 方法

我还在这里查看了幻灯片 25-28:Jython 更新 2012 幻灯片

最后在这里: stackoverflow 问题:使用 Jython 将我的 Python 脚本作为罐子分发

我在运行 OS X 10.8.3 的 mac 上安装了 jython 2.5.3、jvm 1.6 和 python 2.7.3。

这些是我创建 jar 并运行它的步骤:

  1. 从我的 jython 安装目录创建 jython.jar 的副本。
  2. zip -r jython_copy.jar Lib(其中lib是jython安装目录下的文件夹)
  3. cp myJythonProgram.py __run__.py(myJythonProgram.py 不包含 'if name == main ' 行)
  4. zip jython_copy.jar __run__.py
  5. export CLASSPATH=/path/to/my/app/jython_copy.jar:$CLASSPATH

我尝试使用以下三种方法运行 jar:

  1. java org.python.util.jython -jar myapp.jar
  2. java -cp myapp.jar org.python.util.jython -jar myapp.jar
  3. java -jar myapp.jar -jar myapp.jar

如果我的程序不使用任何导入语句,这将有效。

但是我遇到了一个问题,当我运行 jar 时无法找到一些 python 包。例如,当我from random import random在程序中包含该行时,我收到错误“ImportError: No module named random”。当我从 javax.swing、java.awt、time 或 math 导入时,程序中的行没有出现错误。

此外,我尝试使用我的库和一个 jython 程序打包一个 jar,该程序使用前面的步骤以及以下附加步骤导入我的库:

  1. zip jython_copy.jar myLibrary.jar
  2. jar ufm jython_copy.jar othermanifest.mf

othermanifest.mf 仅包含该行Class-Path: ./myLibrary.jar

这也给出了错误“ImportError:没有名为 myLibrary 的模块”

如果我能深入了解我做错了什么或我应该采取的其他步骤,我将不胜感激。

谢谢!

4

2 回答 2

4

我意识到问题出在哪里,我想记录下来以防其他人遇到同样的问题。

我使用的是 Jython 标准安装中的 jython.jar 文件,而不是独立的 jython.jar(使用 Jar 方法中的说明提到了这一点,但构建 Jar中的说明没有)。我仍然不确定为什么将标准安装的 Lib/ 文件夹复制到该安装附带的 jython.jar 中在我的系统上不起作用。但是,一旦我使用了独立的 jar,事情就开始变得更加顺利。

此外,除了我在问题中列出的步骤之外,我还可以通过执行三件事来让我的库与打包文件一起使用:

  1. 分解独立的 jython.jar 并将包含我所有库文件的文件夹复制到 Lib 中,然后创建一个新 jar。这似乎是包含我的库并允许我将所有内容打包到一个 jar 中的最简单方法。

  2. 在阅读了 Frank Wierzbicki 在为什么 Jython 拒绝找到我的 Java 包?因为我现在使用的是独立 jar,所以我不能再使用 style 的导入from java.awt import *,而是需要完全指定要导入的每个东西,例如from java.awt.Font import PLAIN, BOLD, ITALIC. 所以我检查了图书馆的导入并修复了少数风格错误的。

  3. 现在我将我的库直接添加到 Jar 的 Lib 文件夹中,而不是写入Class-Path: ./myLibrary.jarothermanifest.mfMain-Class: org.python.util.JarRunner按照 Frank Wierzbicki 在我的问题中提到的帖子中的回答放入了我的问题:Distributing my Python scripts as JAR files with Jython?

这允许我创建一个包含我想要运行的库和 jython 文件的可双击可执行 jar。

于 2013-09-17T17:39:45.007 回答
1

有两种解决方案。他们都工作,但一个比另一个更好。

我相信您可以将您的 python 脚本重命名为__run__.py,将该文件放在 .jar 文件中,然后通过 python 解释器传递 .jar 文件。有关更多信息,请参阅https://wiki.python.org/jython/UserGuide#invoking-the-jython-interpreter

在 Jython 文档中描述了在通过 JVM 运行时从 java 代码运行 Jython 的多种方法。

编辑:

您可以执行运行所需 python 文件的命令行代码。 在此处链接到从 java 运行命令行代码的示例。

于 2013-05-31T21:37:03.377 回答