Classpath to parametr definiujący listę katalogów oraz plików JAR i ZIP, w których maszyna Javy i kompilator szukają klas i zasobów podczas uruchamiania aplikacji.
Historia pytania:
Od momentu pojawienia się Javy pojawiła się potrzeba organizacji ładowania dużej liczby klas, które często znajdują się w różnych katalogach. W tym celu wymyślono classpath, który umożliwia elastyczne wskazywanie miejsc wyszukiwania zależności.
Problem:
Jeśli classpath jest skonfigurowany nieprawidłowo, aplikacja nie znajdzie potrzebnych klas, co doprowadzi do błędów ładowania (na przykład ClassNotFoundException lub NoClassDefFoundError).
Rozwiązanie:
Classpath można określić za pomocą zmiennej środowiskowej CLASSPATH, parametru wiersza poleceń -cp lub -classpath. Ważne jest, aby jawnie określić wszystkie katalogi i pliki JAR, które są potrzebne do działania aplikacji. Przykład uruchamiania z classpath:
java -cp ".;lib/*" com.example.Main
Kluczowe cechy:
; (Windows) lub : (Linux/macOS)lib/* — wszystkie JAR w folderze libCzy Java może sama znaleźć klasy, jeśli nie są one zapisane w classpath?
Nie, Java nie przeprowadza automatycznego wyszukiwania klas poza wskazanym classpath. Każda ścieżka musi być jawnie podana lub dodana podczas etapu kompilacji lub uruchamiania.
Czy kolejność ścieżek w classpath wpływa na ładowanie klas?
Tak, przy zbieżności nazw klas najpierw znaleziony będzie klasa z pierwszej podanej ścieżki. Kolejność jest ważna, aby uniknąć konfliktów wersji.
Czy można dodać nowy JAR do classpath "w locie" po uruchomieniu aplikacji?
Nie, standardowy mechanizm classpath jest statyczny po uruchomieniu JVM. Dynamiczne ładowanie nowych klas wymaga specjalnych ClassLoaderów.
Aplikacja Java jest uruchamiana z parametrem -cp lib/mylib.jar, zapominając dodać folder z testową konfiguracją. W rezultacie aplikacja kończy działanie z błędem, mimo że biblioteka wydaje się być obecna.
Zalety:
Wady:
Wykorzystywany jest maven/gradle, które same tworzą classpath na podstawie zależności. Uruchomienie odbywa się poprzez skrypt wrappera.
Zalety:
Wady: