2013-05-22 15 views
14

Próbuję spakować program jython do pliku wykonywalnego jar, który użytkownik może dwukrotnie kliknąć, aby uruchomić bez instalowania jython z wyprzedzeniem. Ostatecznie chciałbym dołączyć dodatkową bibliotekę, którą napisałem w słoiku, ale w tej chwili próbuję tylko spakować prosty program i uruchomić go z słoika.Pakowanie programu Jython w plik wykonywalny

Próbowałem postępując zgodnie z instrukcjami słoiku w sekcji "Korzystanie z metody" Jar tutaj: Jython FAQ: Using the Jar Method

Mam również wyglądały na slajdy 25-28 tutaj: Jython Update 2012 slides

I wreszcie tutaj: stackoverflow Question: Distributing My Python Scripts as Jars with Jython

Zainstalowałem jython 2.5.3, jvm 1.6 i python 2.7.3 na moim macu z systemem OS X 10.8.3.

Są to kroki I przejść przez aby utworzyć słoik i uruchom go:

  1. utworzyć kopię jython.jar z mojego katalogu instalacyjnym jython.
  2. zip -r jython_copy.jar Lib (gdzie Lib to folder w katalogu instalacyjnym jython)
  3. cp myJythonProgram.py __run__.py (myJythonProgram.py nie obejmuje 'jeśli nazwa == główny' linia)
  4. zip jython_copy.jar __run__.py
  5. export CLASSPATH=/path/to/my/app/jython_copy.jar:$CLASSPATH

Próbowałem uruchomić słoik za pomocą wszystkich trzech następujących metod:

  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

To działa, jeśli mój program nie używa żadnych oświadczeń importu.

Jednak pojawia się problem, w którym niektórych pakietów Pythona nie można znaleźć, gdy uruchomię jar. Na przykład pojawia się błąd "ImportError: Brak modułu o nazwie losowy", gdy dołączam wiersz from random import random w moim programie. Podczas importowania z javax.swing, java.awt, time lub math nie występują żadne błędy na liniach programu.

Dodatkowo starałem się pakować słoik z mojej biblioteki i program jython który importuje moją bibliotekę wykonaniu powyższych czynności, jak również następujące dodatkowe czynności:

  1. zip jython_copy.jar myLibrary.jar
  2. jar ufm jython_copy.jar othermanifest.mf

othermanifest.mf zawiera tylko linię Class-Path: ./myLibrary.jar.

To też daje błąd „ImportError: No module o nazwie MyLibrary”

Uprzejmie jakiejkolwiek wgląd w to, co robię nieprawidłowo lub inne kroki należy podjąć.

Dzięki!

+0

Czy próbowałeś użyć wtyczki Maven Jython wspomnianej na http://wiki.python.org/jython/JythonFaq/DistributingJythonScripts#Using_Maven? –

+0

Nie, jeszcze nie, ale jeśli nie mogę uruchomić tej metody, to jest to mój następny krok. – Kyle

Odpowiedz

4

Uświadomiłem sobie, na czym polega problem i chciałem go udokumentować na wypadek, gdyby ktoś miał takie same problemy.

używałem plik jython.jar dołączonej do standardowej instalacji Jython, nie zaś samodzielny jython.jar (instrukcje na Using the Jar Method wspomina o tym, ale instrukcje w Building Jars nie). Nadal nie jestem pewien, dlaczego kopiowanie folderu Lib/standardowej instalacji do pliku jython.jar, który pochodzi z tą instalacją, nie działało w moim systemie. Kiedy jednak użyłem samodzielnego słoja, wszystko zaczęło działać sprawniej.

Dodatkowo, udało mi się dostać moją bibliotekę do pracy z plikiem zapakowanego wykonując trzy rzeczy oprócz etapów I określonymi w moje pytanie:

  1. Exploding autonomiczną jython.jar i kopiowanie folder z wszystkimi moimi plikami bibliotecznymi w Lib, a następnie utwórz nowy słoik. To wydawało się najłatwiejszym sposobem włączenia mojej biblioteki i pozwala mi spakować wszystko w pojedynczy słoik.

  2. odkryłem po przeczytaniu odpowiedzi Franka Wierzbicki w Why does Jython refuse to find my Java package? że ponieważ jestem teraz przy użyciu słoik autonomiczną, nie mogłem już korzystać z importu stylu from java.awt import *, zamiast tego potrzebne, aby w pełni określić każdą rzeczą, jaką importuje, na przykład from java.awt.Font import PLAIN, BOLD, ITALIC . Więc przeszedłem przez import biblioteki i naprawiłem kilka niewłaściwych stylów.

  3. Teraz dodaję moją bibliotekę bezpośrednio do folderu słoika za Lib, zamiast pisać Class-Path: ./myLibrary.jar w othermanifest.mf, kładę Main-Class: org.python.util.JarRunner jak za odpowiedź Franka Wierzbickiego w poście wspomniałem w moim pytaniu: Distributing my Python scripts as JAR files with Jython?

Pozwoliło mi to utworzyć podwójnie klikalny plik wykonywalny zawierający moją bibliotekę i plik jython, który chciałem uruchomić.

1

Istnieją dwa rozwiązania. Oboje pracują, ale jeden lepszy od drugiego.

Wierzę, że możesz zmienić nazwę swojego skryptu python jako __run__.py, umieścić ten plik w pliku .jar i przekazać plik .jar przez interpreter python. Aby uzyskać więcej informacji, patrz https://wiki.python.org/jython/UserGuide#invoking-the-jython-interpreter.

Wiele metod uruchamiania Jython z kodu java podczas uruchamiania przez JVM opisano w dokumentacji Jython jako here,.

EDIT:

można wykonać polecenia wiersza kodu, który jest uruchamiany plik Pythona chcesz. Link to an example of running command line code from java here.

Powiązane problemy