Classpath is een parameter die de lijst met directories, JAR- en ZIP-archieven definieert waarin de Java Virtual Machine en compiler naar klassen en bronnen zoeken bij het starten van een applicatie.
Achtergrond:
Sinds de opkomst van Java was er behoefte om de laadprocedure van een groot aantal klassen die vaak in verschillende directories staan te organiseren. Hiervoor werd classpath bedacht, dat het mogelijk maakt om flexibel zoeklocaties voor afhankelijkheden op te geven.
Probleem:
Als classpath verkeerd is ingesteld, kan de applicatie de benodigde klassen niet vinden, wat leidt tot laadsfouten (bijvoorbeeld ClassNotFoundException of NoClassDefFoundError).
Oplossing:
Classpath kan worden ingesteld via de omgevingsvariabele CLASSPATH, de commandoregelparameter -cp of -classpath. Het is belangrijk om expliciet alle directories en JAR-bestanden op te geven die nodig zijn voor de werking van de applicatie. Voorbeeld van een uitvoering met classpath:
java -cp ".;lib/*" com.example.Main
Belangrijke kenmerken:
; (Windows) of : (Linux/macOS)lib/* — alle JAR's in de map libKan Java zelf klassen vinden als ze niet in classpath zijn opgegeven?
Nee, Java voert geen automatische zoektocht naar klassen buiten de opgegeven classpath uit. Elk pad moet expliciet worden opgegeven of toegevoegd tijdens het bouwen of starten.
Beïnvloedt de volgorde van paden in classpath de laadprocedure van klassen?
Ja, bij gelijke klassennamen wordt de klasse van het eerst opgegeven pad als eerste gevonden. De volgorde is belangrijk om versieconflicten te voorkomen.
Kan een nieuwe JAR "in de lucht" aan classpath worden toegevoegd nadat de applicatie is gestart?
Nee, het standaard classpath mechanisme is statisch na het opstarten van de JVM. Dynamische laads van nieuwe klassen vereist speciale ClassLoader's.
Een Java-applicatie wordt gestart met de parameter -cp lib/mylib.jar, maar vergeet de map met de testconfiguratie toe te voegen. Als gevolg daarvan crasht de applicatie met een fout, hoewel de bibliotheek blijkbaar aanwezig is.
Voordelen:
Nadelen:
Maven/Gradle wordt gebruikt, die zelf de classpath op basis van afhankelijkheden vormen. De uitvoering wordt gedaan via een wrapper-script.
Voordelen:
Nadelen: