在可执行jar中打包Jython程序

时间:2013-05-22 21:36:40

标签: jython packaging executable-jar

我正在尝试将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 名称 == '行)
  4. zip jython_copy.jar __run__.py
  5. export CLASSPATH=/path/to/my/app/jython_copy.jar:$CLASSPATH
  6. 我尝试使用以下三种方法运行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
    4. 如果我的程序不使用任何import语句,则此方法有效。

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

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

      1. zip jython_copy.jar myLibrary.jar
      2. jar ufm jython_copy.jar othermanifest.mf
      3. othermanifest.mf仅包含行Class-Path: ./myLibrary.jar

        这也会出现错误“ImportError:No module named myLibrary”

        如果我对错误或我应该采取的其他步骤有所了解,我将不胜感激。

        谢谢!

2 个答案:

答案 0 :(得分:4)

我意识到问题是什么,我想记录它以防其他人遇到同样的问题。

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

此外,除了我在问题中列出的步骤之外,我还能通过三件事来让我的库使用打包文件:

  1. 爆炸独立的jython.jar并将包含我所有库文件的文件夹复制到Lib中,然后创建一个新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. 既然我正在将我的库直接添加到Jar的Lib文件夹中,而不是在Class-Path: ./myLibrary.jar中写othermanifest.mf,我根据Frank Wierzbicki在帖子中的回答放Main-Class: org.python.util.JarRunner我在提问中提到:Distributing my Python scripts as JAR files with Jython?

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

答案 1 :(得分:1)

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

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

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

编辑:

您可以执行运行所需python文件的命令行代码。 here,