【问题标题】:Packaging a Jython program in an executable jar将 Jython 程序打包到可执行 jar 中
【发布时间】:2013-05-18 02:35:01
【问题描述】:

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

我已尝试按照此处“使用 Jar 方法”部分中的 jar 说明进行操作:Jython FAQ: Using the Jar Method

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

最后在这里: stackoverflow Question: Distributing My Python Scripts as Jars with Jython

我在运行 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 == ma​​in' 行)
  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: No module named myLibrary”

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

谢谢!

【问题讨论】:

  • 您是否尝试过使用wiki.python.org/jython/JythonFaq/… 中提到的 Maven Jython 插件?
  • 目前还没有,但如果我不能让这个方法起作用,那么我的下一步就是。

标签: jython packaging executable-jar


【解决方案1】:

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

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

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

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

  2. 在阅读 Frank Wierzbicki 在 Why does Jython refuse to find my Java package? 中的回答后,我发现因为我现在使用的是独立 jar,所以我不能再使用 from java.awt import * 样式的导入,而是需要完全指定我的每一件事导入,例如from java.awt.Font import PLAIN, BOLD, ITALIC。所以我检查了库的导入并修复了一些错误的样式。

  3. 1234563 Distributing my Python scripts as JAR files with Jython?

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

【讨论】:

    【解决方案2】:

    有两种解决方案。它们都有效,但一个比另一个好。

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

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

    编辑:

    你可以执行一个命令行代码来运行你想要的 python 文件。 Link to an example of running command line code from java here.

    【讨论】:

      猜你喜欢
      • 2011-01-11
      • 2012-07-11
      • 2017-05-27
      • 2015-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多