Co to jest ścieżka klas i jak ją ustawić?

324

Właśnie czytałem ten wiersz:

Pierwszą rzeczą, jaką robi metoda format (), jest załadowanie szablonu Velocity ze ścieżki klasy o nazwie output.vm

Wyjaśnij, co w tym kontekście oznaczała ścieżka klasy i jak powinienem ustawić ścieżkę klasy.

Blankman
źródło

Odpowiedzi:

530

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.jarw swojej ścieżce klasy. Maszyna wirtualna zajrzy do pliku jar dla org/javaguy/coolframeworkczęści i znajdzie swoją klasę.

Zatem ścieżki klas zawierają:

  • Pliki JAR i
  • Ścieżki do początku hierarchii pakietów.

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 -cpparametru 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 .shlub .bat, który oblicza ścieżkę klasy i przekazuje ją do Java za pomocą -cpparametru.

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ń).

bokmann
źródło
12
Kolejny dobrze wyjaśniony blog na temat PATH i CLASSPATH w Javie - Path vs ClassPath
KNU
W pythonie znajduje się folder o nazwie Lib, w którym można przechowywać dowolny moduł do użycia w dowolnym momencie za pomocą prostej instrukcji importu. Czy różni się to od ustawiania zmiennej środowiskowej CLASSPATH na katalog dla pakietów Java innych firm? Mimo że byłby to globalny, nie byłoby potrzeby zmieniać zmiennej, poza dodawaniem kolejnych pakietów.
Josie Thompson
Dobra odpowiedź, ale dla manekinów tutaj: Dlaczego nie musisz używać polecenia -cp dla każdej nowej klasy, którą tworzysz? To z pewnością zostanie rozwiązane automatycznie przez twój system, prawda? Ale jak? Czasami napotykam problem polegający na tym, że „czegoś” nie można znaleźć w mojej ścieżce klasy - wydaje mi się, że dzieje się tak, ponieważ nie dodałem go do cp, ale dlaczego taki błąd występuje tylko czasami zamiast zawsze? Pytam o to, bo szczerze mówiąc, nigdy nie
dodawałem
2
@Vic Ścieżka klasy musi zawierać katalog powyżej hierarchii katalogów odpowiadający nazwie pakietu. Więc jeśli tak 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.hotfww 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.
tjalling
@Vic Bardziej konkretny przykład i wyjaśnienie znajduje się w Opanowaniu języka Java CLASSPATH (według doskonałego komentarza KNU )
tjalling
67

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.

Stephen C.
źródło
13

Ścieżka klasy to ścieżka, w której wirtualna maszyna Java szuka klas, pakietów i zasobów zdefiniowanych przez użytkownika w programach Java.

W tym kontekście format()metoda ładuje plik szablonu z tej ścieżki.

Rozpad
źródło
5

Ś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.

Romain
źródło
2

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

lft93ryt
źródło
1
Chociaż te polecenia mogą być przydatne do pracy ze zmiennymi środowiskowymi, nie odpowiada to na pytanie
Hulk
1

Ś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.

Bimalendu nath
źródło
1

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
Unnati Solanki
źródło
0

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.


źródło
0

Użytkownicy Linuksa oraz podsumowując i dodając do tego, co powiedzieli inni, powinieneś wiedzieć, co następuje:

  1. $ 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).

  2. 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ęć.

  3. 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.

  4. Tomcat nie używa CLASSPATH. Przeczytaj, co z tym zrobić tutaj: https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html

Adam Winter
źródło