我正在尝试将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并运行它的步骤:
zip -r jython_copy.jar Lib
(其中Lib是jython安装目录中的文件夹)cp myJythonProgram.py __run__.py
(myJythonProgram.py不包含'if 名称 == 主'行)zip jython_copy.jar __run__.py
export CLASSPATH=/path/to/my/app/jython_copy.jar:$CLASSPATH
我尝试使用以下三种方法运行jar:
java org.python.util.jython -jar myapp.jar
java -cp myapp.jar org.python.util.jython -jar myapp.jar
java -jar myapp.jar -jar myapp.jar
如果我的程序不使用任何import语句,则此方法有效。
但是我遇到了一个问题,当我运行jar时无法找到一些python包。例如,当我在程序中包含行from random import random
时,我收到错误“ImportError:No module called random”。从javax.swing,java.awt,time或math导入时,程序中的行没有错误。
此外,我尝试使用我的库和jython程序打包jar,该程序使用前面的步骤导入我的库以及以下附加步骤:
zip jython_copy.jar myLibrary.jar
jar ufm jython_copy.jar othermanifest.mf
othermanifest.mf仅包含行Class-Path: ./myLibrary.jar
。
这也会出现错误“ImportError:No module named myLibrary”
如果我对错误或我应该采取的其他步骤有所了解,我将不胜感激。
谢谢!
答案 0 :(得分:4)
我意识到问题是什么,我想记录它以防其他人遇到同样的问题。
我使用的是Jython标准安装中的jython.jar文件,而不是独立的jython.jar(Using the Jar Method的说明提到了这一点,但Building Jars的说明没有)。我仍然不确定为什么将标准安装的Lib /文件夹复制到该安装附带的jython.jar中并不适用于我的系统。但是,一旦我使用独立的jar,事情开始变得更加顺利。
此外,除了我在问题中列出的步骤之外,我还能通过三件事来让我的库使用打包文件:
爆炸独立的jython.jar并将包含我所有库文件的文件夹复制到Lib中,然后创建一个新jar。这似乎是包含我的库的最简单方法,并允许我将所有内容打包到一个罐子里。
我在阅读Frank Wierzbicki在Why does Jython refuse to find my Java package?中的答案之后发现,因为我现在正在使用独立jar,我无法再使用样式from java.awt import *
的导入,而是需要完全指定我导入的每件事,例如from java.awt.Font import PLAIN, BOLD, ITALIC
。所以我浏览了图书馆的导入并修复了一些错误的样式。
既然我正在将我的库直接添加到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?
这允许我创建一个双击的可执行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,