Odpowiedzi:
Podczas programowania w Javie udostępniasz inne klasy pisanej klasie, umieszczając coś takiego na początku pliku źródłowego:
import org.javaguy.coolframework.MyClass;
A czasem „masowo” importujesz rzeczy, mówiąc:
import org.javaguy.coolframework.*;
Więc później w swoim programie, kiedy mówisz:
MyClass mine = new MyClass();
Wirtualna maszyna Java będzie wiedziała, gdzie znaleźć skompilowaną klasę.
Byłoby niepraktyczne, aby maszyna wirtualna przeglądała każdy folder na komputerze, więc musisz dostarczyć maszynie wirtualnej listę miejsc do obejrzenia. Odbywa się to poprzez umieszczenie plików folderów i słoików na ścieżce klasy.
Zanim porozmawiamy o ustawieniu ścieżki klasy, porozmawiajmy o plikach .class, pakietach i plikach .jar.
Po pierwsze, załóżmy, że MyClass jest czymś, co zbudowałeś w ramach swojego projektu, i że znajduje się w katalogu twojego projektu o nazwie output
. Plik .class będzie w output/org/javaguy/coolframework/MyClass.class
(wraz z każdym innym plikiem w tym pakiecie). Aby uzyskać dostęp do tego pliku, ścieżka musi po prostu zawierać folder „wynik”, a nie całą strukturę pakietu, ponieważ instrukcja importu dostarcza wszystkie te informacje do maszyny wirtualnej.
Załóżmy teraz, że umieścisz CoolFramework w pliku .jar i umieścisz CoolFramework.jar w katalogu lib w swoim projekcie. Musisz teraz umieścić lib/CoolFramework.jar
w swojej ścieżce klasy. Maszyna wirtualna zajrzy do pliku jar dla org/javaguy/coolframework
części i znajdzie swoją klasę.
Zatem ścieżki klas zawierają:
Jak ustawić ścieżkę klasy?
Pierwszy sposób, w jaki wszyscy się uczą, to zmienne środowiskowe. Na maszynie unixowej możesz powiedzieć coś takiego:
export CLASSPATH=/home/myaccount/myproject/lib/CoolFramework.jar:/home/myaccount/myproject/output/
Na komputerze z systemem Windows musisz przejść do ustawień środowiska i dodać lub zmodyfikować wartość, która już tam jest.
Drugim sposobem jest użycie -cp
parametru podczas uruchamiania Java, tak jak poniżej:
java -cp "/home/myaccount/myproject/lib/CoolFramework.jar:/home/myaccount/myproject/output/" MyMainClass
Wariantem tego jest trzeci sposób, który często odbywa się za pomocą pliku .sh
lub .bat
, który oblicza ścieżkę klasy i przekazuje ją do Java za pomocą -cp
parametru.
Istnieje powyższe „gotcha”. W większości systemów (Linux, Mac OS, UNIX itp.) Znak dwukropka („:”) jest separatorem ścieżki klas. W windowsm separatorem jest średnik (';')
Więc jaki jest najlepszy sposób, aby to zrobić?
Globalne ustawienie zmiennych za pomocą zmiennych środowiskowych jest złe, ogólnie z tych samych powodów, dla których zmienne globalne są złe. Zmieniasz zmienną środowiskową CLASSPATH, aby jeden program działał, i w końcu psujesz inny program.
-Cp jest właściwą drogą. Generalnie upewniam się, że moja zmienna środowiskowa CLASSPATH jest pustym ciągiem, w którym rozwijam się, gdy tylko jest to możliwe, dzięki czemu unikam problemów z globalną ścieżką klasy (niektóre narzędzia nie są zadowolone, gdy globalna ścieżka klasy jest pusta - znam dwa wspólne, mega-tysiące serwery J2EE i Java z licencją dolarową, które mają tego rodzaju problemy z narzędziami wiersza poleceń).
org.javaguy.coolfw
, przy odpowiedniej strukturze katalogów /path/to/org/javaguy/coolfw/
ścieżka klasy musiałaby zawierać /path/to/
. Jeśli dodam nowy pakiet org.javaguy.hotfw
w tym samym projekcie, wynikowa klasa (zwykle) kończy się na /path/to/org/javaguy/hotfw/
. Wymaga to zawarcia ścieżki klasy /path/to/
, co już zawiera. Tak więc nowy pakiet (i zawarte w nim klasy) nie wymagają nowych dodatków do ścieżki klas.
Pomyśl o tym jako o odpowiedzi Javy na zmienną środowiskową PATH - systemy operacyjne szukają plików EXE na PATH, Java szuka klas i pakietów na ścieżce klas.
Ścieżka klasy w tym kontekście jest dokładnie taka, jak w ogólnym kontekście: gdziekolwiek maszyna wirtualna wie, może znaleźć klasy do załadowania, a także zasoby (takie jak w twoim przypadku output.vm).
Rozumiem, że Velocity spodziewa się znaleźć plik o nazwie output.vm w dowolnym miejscu w „bez pakietu”. Może to być plik JAR, zwykły folder ... Katalog główny dowolnej lokalizacji w ścieżce klas aplikacji.
Ustawianie zmiennej systemowej CLASSPATH
Aby wyświetlić bieżącą zmienną CLASSPATH, użyj tych poleceń w systemie Windows i UNIX (powłoka Bourne'a): W systemie Windows: C:\> set CLASSPATH
W systemie UNIX: % echo $CLASSPATH
Aby usunąć bieżącą zawartość zmiennej CLASSPATH, użyj następujących poleceń: W systemie Windows: C:\> set CLASSPATH=
W systemie UNIX: % unset CLASSPATH; export CLASSPATH
Aby ustawić zmienną CLASSPATH, użyj następujących poleceń (na przykład): W systemie Windows: C:\> set CLASSPATH=C:\users\george\java\classes
W systemie UNIX: % CLASSPATH=/home/george/java/classes; export CLASSPATH
Ścieżka klasy jest zmienną środowiskową systemu. Ustawienie tej zmiennej służy do zapewnienia katalogu głównego dowolnej hierarchii pakietów dla kompilatora Java.
CLASSPATH to zmienna środowiskowa (tj. Globalne zmienne systemu operacyjnego dostępne dla wszystkich procesów) potrzebna kompilatorowi Java i środowisku wykonawczemu do zlokalizowania pakietów Java używanych w programie Java. (Dlaczego nie wywołać PACKAGEPATH?) Jest to podobne do innej zmiennej środowiskowej PATH, która jest używana przez powłokę CMD do znajdowania programów wykonywalnych.
CLASSPATH można ustawić na jeden z następujących sposobów:
CLASSPATH can be set permanently in the environment: In Windows, choose control panel ⇒ System ⇒ Advanced ⇒ Environment Variables ⇒ choose "System Variables" (for all the users) or "User Variables" (only the currently login user) ⇒ choose "Edit" (if CLASSPATH already exists) or "New" ⇒ Enter "CLASSPATH" as the variable name ⇒ Enter the required directories and JAR files (separated by semicolons) as the value (e.g., ".;c:\javaproject\classes;d:\tomcat\lib\servlet-api.jar"). Take note that you need to include the current working directory (denoted by '.') in the CLASSPATH.
To check the current setting of the CLASSPATH, issue the following command:
> SET CLASSPATH
CLASSPATH can be set temporarily for that particular CMD shell session by issuing the following command:
> SET CLASSPATH=.;c:\javaproject\classes;d:\tomcat\lib\servlet-api.jar
Instead of using the CLASSPATH environment variable, you can also use the command-line option -classpath or -cp of the javac and java commands, for example,
> java –classpath c:\javaproject\classes com.abc.project1.subproject2.MyClass3
Element statyczny klasy można wywoływać bezpośrednio, bez tworzenia instancji obiektu. Ponieważ główną metodą jest statyczna wirtualna maszyna Java, może ją wywoływać bez tworzenia instancji klasy zawierającej główną metodę, która jest punktem startowym programu.
Użytkownicy Linuksa oraz podsumowując i dodając do tego, co powiedzieli inni, powinieneś wiedzieć, co następuje:
$ CLASSPATH jest tym, czego Java używa do przeszukiwania wielu katalogów w celu znalezienia wszystkich różnych klas potrzebnych dla twojego skryptu (chyba że jawnie powiesz inaczej z przesłonięciem -cp). Użycie -cp wymaga ręcznego śledzenia wszystkich katalogów i kopiowania i wklejania tego wiersza za każdym razem, gdy uruchamiasz program (nie jest to preferowane IMO).
Znak dwukropka („:”) oddziela różne katalogi. Jest tylko jeden $ CLASSPATH i zawiera wszystkie katalogi. Tak więc, kiedy uruchomisz „export CLASSPATH = ....”, chcesz dołączyć bieżącą wartość „$ CLASSPATH” w celu dołączenia do niej. Na przykład:
export CLASSPATH=.
export CLASSPATH=$CLASSPATH:/usr/share/java/mysql-connector-java-5.1.12.jar
W pierwszym wierszu powyżej zaczynasz CLASSPATH tylko prostą „kropką”, która jest ścieżką do twojego bieżącego katalogu roboczego. Dzięki temu za każdym razem, gdy uruchomisz java, będzie szukał klas w bieżącym katalogu roboczym (tym, w którym jesteś). W drugim wierszu powyżej $ CLASSPATH pobiera wartość, którą poprzednio wprowadziłeś (.) I dołącza ścieżkę do mysql dirver. Teraz Java będzie szukała sterownika ORAZ twoich zajęć.
echo $CLASSPATH
jest bardzo przydatny, a to, co zwraca, powinno wyglądać jak rozdzielona dwukropkami lista wszystkich katalogów i plików .jar, chcesz, aby java szukała potrzebnych klas.
Tomcat nie używa CLASSPATH. Przeczytaj, co z tym zrobić tutaj: https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html