2009-11-05 11 views
12

Wiem, że to coś głupiego, ale z jakiegoś powodu Jython odmawia znalezienia javax.swing. Używam Java 1.6.0_11. To jest mój skrypt startowy:Dlaczego Jython nie chce znaleźć mojego pakietu Java?

@echo off 

"%JAVA_HOME%\bin\java" -Xmx1024M -classpath ".;c:\Projects\Jython2.5.1\jython.jar" org.python.util.jython 

moje wyjście wygląda następująco:

Jython 2.5.1 (Release_2_5_1:6813, Sep 26 2009, 13:47:54) 
[Java HotSpot(TM) Client VM (Sun Microsystems Inc.)] on java1.6.0_10 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import javax.swing 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: No module named swing 
>>> import javax 
>>> dir(javax) 
['__name__'] 
>>> 
+3

Jest to niezwykle częste pytanie/problem. Jest szansa, że ​​zmieniłbyś tytuł na "Dlaczego Jython nie chce znaleźć mojego pakietu Java?" w ten sposób więcej osób prawdopodobnie to znajdzie. –

+0

Zmieniłem nazwę - masz rację, to może się zdarzyć każdemu. – MikeHoss

+0

Dzięki za zmianę nazwy! –

Odpowiedz

12

Najprawdopodobniej Jython nie skanuje twoich paczek. Podczas uruchamiania Jython próbuje przejść przez pliki jar i klasy na swojej ścieżce i skanować pakiety Java. Jest to konieczne, ponieważ nie ma możliwości wyszukania pakietów Javy przez odbicie. Skanowanie pakietów może być celowo wyłączone lub możesz nie mieć uprawnień do zapisu, jeśli chcesz zapisać buforowane informacje, aby uzyskać więcej informacji. Najlepszym sposobem, aby zaimportować klasy Java jest zrobić tak jawnie klasy przez klasy, tak jak poniżej:

from javax.swing import JFrame 

Ta metoda powinna zawsze działać, nawet jeśli skanowanie pakiet jest wyłączony lub w inny sposób niezdolny do pracy i jest zalecane podejście (choć może to być trochę żmudne). Jeśli chcesz zaimportować pakiety (lub chcesz zrobić "z javax.swing import *", co zależy również od skanowania pakietu - ale jest odradzane), musisz dowiedzieć się, dlaczego skanowanie pakietów nie działa.

+0

Działanie obiektu "z obiektu importowanego pakietu". Rozumiem, dlaczego skanowanie pakietów nie działa, ale przynajmniej mam coś do zrobienia. Dzięki Frank! Kontynuuj wspaniałą pracę! – MikeHoss

1

Używam Java 1.6.0_11

Nie używasz

[Klient wirtualnej maszyny Java HotSpot ™ (Sun Microsystems Inc.)] na java1.6.0_10

Co się dzieje, jeśli usunąć cachedir z katalogu dystrybucyjnego Jython i spróbować jeszcze raz?

Co więcej, dlaczego wyraźnie ustawiasz ścieżkę klas w ten sposób? Dlaczego nie po prostu

java -jar jython.jar 

?

+0

Używam autonomicznego słoika Jython, który nie buforuje. I nie mogę uruchomić tego z -jar, ponieważ w końcu zacznę dodawać inne słoiki do ścieżki klasy. – MikeHoss

+0

można włączyć buforowanie nawet przy użyciu autonomicznego słoika. Zobacz moją odpowiedź w tym wątku. – Mikeyg36

11

Miałem podobne problemy i okazało się, że , ponieważ autonomiczny dist Jython nie obsługuje buforowania, nie obsługuje także podejścia "import *". To nie jest jasno udokumentowane nigdzie w oficjalnych docs jython, ale doszedłem do wniosku, to na podstawie wielu różnych raportów o błędach:

Znaki z tego ostatniego linku:

Tak jak zauważył Oti, w wersji samodzielnej musisz wykonać pełny import, aby odnieść sukces.

Aby naprawić swój problem, użyj niestandardowego standardowego jython.jar wygenerowany przez zainstalowanie jython za pomocą opcji "Standard".

Jeśli chciałeś spakować i rozpowszechniać plik jython.jar razem z aplikacją, na wypadek, gdyby użytkownik nie miał zainstalowanego Jython, musisz również skopiować/pase pełny folder "Lib" z katalogu instalacyjnego Jython w cokolwiek lokalizacja kończysz umieszczając plik jython.jar. Umożliwia to dostęp do stdlib Pythona, który nie jest zawarty w standardowym pliku jar.

UPDATE: Po zabawy więcej, myślę, że mam poprawkę, aby włączyć „import *” importu typu nawet podczas korzystania z autonomicznego jar. Wszystko, co należy zrobić, to włączyć buforowanie!

Można to zrobić albo poprzez dodanie następujących opcji do JVM, gdy uruchomiony jython:

-Dpython.cachedir.skip = fałszywy -Dpython.cachedir = DESIRED CACHE PATH

(Uwaga: drugi argument jest opcjonalny, a jeśli pozostanie pusty, zostanie użyta wartość domyślna)

Jeśli masz problem z uruchomieniem aplikacji InteractiveConsole osadzonej w aplikacji (która jest w Miałem problem) możesz dodać te właściwości przed inicjalizacją konsoli:

Properties props = new Properties(); 
    props.put("python.cachedir.skip", "false"); 
    props.put("python.cachedir", "DESIRED CACHE PATH"); // again, this option is optional 
    InteractiveConsole.initialize(System.getProperties(), props, new String[0]); 
+0

Czy mimo to należy zmodyfikować autonomiczny plik jar, aby plik python.cachedir.skip był domyślnie ustawiony na wartość false? – Kyle

Powiązane problemy