Упаковка программы Jython в исполняемом банке - программирование
Подтвердить что ты не робот

Упаковка программы 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"

Я был бы признателен за любое понимание того, что я делаю неправильно или другие шаги, которые я должен предпринять.

Спасибо!

4b9b3361

Ответ 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 здесь.