Упаковка программы Jython в исполняемом банке
Я пытаюсь упаковать jython-программу в исполняемый jar, который пользователь может просто дважды щелкнуть, чтобы запустить, не устанавливая jython раньше времени. В конечном счете, я хотел бы добавить дополнительную библиотеку, которую я написал с банкой, но на данный момент я просто пытаюсь упаковать простую программу и запустить ее из банки.
Я пробовал следовать инструкциям jar в разделе "Использование метода Jar" здесь: Вопросы по Jython: Использование метода Jar
Я также посмотрел на слайды 25-28: Jython Update 2012 слайды
И, наконец, здесь:
qaru.site/info/82703/...
Я установил jython 2.5.3, jvm 1.6 и python 2.7.3 на мой Mac, который работает с OS X 10.8.3.
Вот шаги, которые я предпринимаю, чтобы создать банку и запустить ее:
- Создайте копию jython.jar из каталога установки jython.
-
zip -r jython_copy.jar Lib
(где Lib - это папка в каталоге установки jython)
-
cp myJythonProgram.py __run__.py
(myJythonProgram.py не включает строку "if name == main)
-
zip jython_copy.jar __run__.py
-
export CLASSPATH=/path/to/my/app/jython_copy.jar:$CLASSPATH
Я попытался запустить банку, используя все три из этих методов:
-
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
Это работает, если моя программа не использует никаких операторов импорта.
Однако я столкнулся с проблемой, когда некоторые пакеты python не могут быть найдены, когда я запускаю банку. Например, я получаю сообщение об ошибке "ImportError: No module named random", когда я включаю строку from random import random
в свою программу. Ошибок не возникает в строках в программе, когда я импортирую из javax.swing, java.awt, time или math.
Кроме того, я попытался упаковать банку с моей библиотекой и программой jython, которая импортирует мою библиотеку с использованием предыдущих шагов, а также следующие дополнительные шаги:
-
zip jython_copy.jar myLibrary.jar
-
jar ufm jython_copy.jar othermanifest.mf
othermanifest.mf содержит только строку Class-Path: ./myLibrary.jar
.
Это также дает ошибку "ImportError: Нет модуля с именем myLibrary"
Я был бы признателен за любое понимание того, что я делаю неправильно или другие шаги, которые я должен предпринять.
Спасибо!
Ответы
Ответ 1
Я понял, в чем проблема, и я хотел документировать его, если у кого-то другие проблемы.
Я использовал файл jython.jar, который приходил в стандартную установку Jython, и НЕ автономный jython.jar(инструкции в Использование Jar Метод упоминает это, но инструкции в Building Jars не поддерживают). Я до сих пор не знаю, почему копирование папки Lib/стандартной установки в jython.jar, которая пришла с этой установкой, не работала в моей системе. Однако, как только я использовал автономную банку, все стало работать более плавно.
Кроме того, мне удалось заставить мою библиотеку работать с упакованным файлом, выполнив три действия в дополнение к тем, которые я изложил в своем вопросе:
-
Взрываем автономный jython.jar и копируем папку со всеми моими библиотечными файлами в Lib, а затем создаем новую банку. Казалось, это самый простой способ включить мою библиотеку и позволяет мне упаковать все в одну банку.
-
Я узнал после того, как прочитал ответ Фрэнка Вьерцбицки в Почему Jython отказывается найти мой Java-пакет?, потому что я теперь использую автономную банку, я мог бы больше не используют импорт стиля from java.awt import *
, вместо этого мне нужно было полностью указать каждую вещь, которую я импортировал, например from java.awt.Font import PLAIN, BOLD, ITALIC
. Поэтому я прошел через импорт библиотеки и исправил несколько неправильных тем.
-
Теперь, когда я добавляю свою библиотеку непосредственно в папку Jar Lib, вместо записи Class-Path: ./myLibrary.jar
в othermanifest.mf
, я помещаю Main-Class: org.python.util.JarRunner
в соответствии с ответом Фрэнка Вьерцбицки в сообщении, которое я упомянул в своем вопросе: Распространение моих скриптов Python в виде файлов JAR с помощью Jython?
Это позволило мне создать исполняемый файл с двойным щелчком, содержащий мою библиотеку и файл jython, которые я хотел запустить.
Ответ 2
Существует два решения. Они оба работают, но лучше, чем другие.
Я считаю, что вы можете переименовать свой python script как __run__.py
, поместить этот файл в файл .jar и передать файл .jar через интерпретатор python. Подробнее см. https://wiki.python.org/jython/UserGuide#invoking-the-jython-interpreter.
Несколько методов запуска Jython из java-кода во время работы с JVM описаны здесь в документации Jython.
EDIT:
Вы можете выполнить код командной строки, который запускает файл python, который вы хотите.
Ссылка на пример запуска кода командной строки из java здесь.