In diesem Abschnitt wird beschrieben, wie der Java-Erstellungspfad festgelegt wird. Der Erstellungspfad ist der Klassenpfad, der für die Erstellung eines Java-Projektes (IJavaProject) verwendet wird.
Ein Klassenpfad ist einfach ein Bereich von Klassenpfadeinträgen (IClassPathEntry), die die verfügbaren Typen beschreiben. Die Typen können als Quelle oder in binärem Format vorliegen. Die Reihenfolge der Einträge im Pfad definiert die Suchreihenfolge für das Auflösen von Typen während einer Erstellung.
Der Java-Erstellungspfad wird in der Struktur eines Java-Projektelements wiedergegeben. Sie können ein Paket nach den Stammverzeichnissen seiner Paketfragmente (IPackageFragmentRoot) abfragen. Jeder Klassenpfadeintrag ist mindestens einem Stammverzeichnis für Paketfragmente zugeordnet, das wiederum jeweils eine Gruppe von Paketfragmenten enthält.
Diese Erläuterung des Erstellungspfades betrifft nicht den Java-Laufzeitpfad, der separat zum Erstellungspfad definiert werden kann. Eine Erläuterung des Laufzeitklassenpfades können Sie unter Java-Code ausführen nachlesen.
Sie können den Erstellungspfad eines Projekts über das Programm unter Verwendung von
setRawClasspath für das entsprechende Java-Element des Projekts ändern. Der
folgende Code legt den Klassenpfad für eine Projektressource fest:
IProject project = ... // get some project resource
IJavaProject javaProject = JavaCore.create(project);
IClasspathEntry[] newClasspath = ...;
javaProject.setRawClasspath(newClasspath, someProgressMonitor);
(Hinweis: Die Verwendung des Begriffes "raw" (= unformatiert) für den Klassenpfad hebt die Tatsache hervor, dass keine Variablen aufgelöst wurden, mit denen Eintragspositionen beschrieben werden.)
Der Java-Erstellungspfad wird in einer Datei namens '.classpath' in der Dateistruktur des Projekts gespeichert. Diese Datei soll eine gemeinsame Benutzung der Einstellungen von Java-Erstellungspfaden über ein Quellcoderepository ermöglichen. Diese Datei sollte nicht manuell bearbeitet werden, da sie sonst beschädigt werden könnte.
Klassenpfadeinträge können unter Verwendung von Factorymethoden, die unter JavaCore definiert sind, festgelegt werden. Klassenpfadeinträge können auf folgende Elemente verweisen:
Das folgende Beispiel ist ein Klassenpfadeintrag,
der den Quellenordner "src" des Projektes "MyProject" angibt: IClassPathEntry srcEntry = JavaCore.newSourceEntry(new Path("/MyProject/src"));
Das folgende Beispiel ist ein Klassenpfadeintrag, der den Klassendateiordner "lib" von "MyProject" angibt:
IClassPathEntry libEntry = JavaCore.newLibraryEntry(
new Path("/MyProject/lib"),
null, //no source
null, //no source
false); //not exported
Dem folgenden Klassenpfadeintrag ist eine Quelle zugeordnet:
IClassPathEntry libEntry = JavaCore.newLibraryEntry(
new Path("d:/lib/foo.jar"), // library location
new Path("d:/lib/foo_src.zip"), //source archive location
new Path("src"), //source archive root path
true); //exported
Der Stammverzeichnispfad des Quellenarchivs beschreibt die Position des Stammverzeichnisses innerhalb des Quellenarchivs. Ist er auf Null gesetzt, wird das Stammverzeichnis des Archivs dynamisch heruntergesetzt.
Der folgende Klassenpfadeintrag gibt ein Vorbedingungsprojekt namens "MyFramework" an.
IClassPathEntry prjEntry = JavaCore.newProjectEntry(new Path("/MyFramework"), true); //exported
Es ist möglich, einen automatischen Initialisierungsoperator für Klassenpfadvariablen zu registrieren, der über den Erweiterungspunkt org.eclipse.jdt.core.classpathVariableInitializer aufgerufen wird, wenn der Arbeitsbereich gestartet wird.
Der folgende Klassenpfadeintrag gibt eine Bibliothek an, deren Position in der Variablen 'HOME' enthalten ist. Die Quellenzuordnung wird mit Hilfe der Variablen 'SRC_HOME' und 'SRC_ROOT' definiert:
IClassPathEntry varEntry = JavaCore.newVariableEntry(
new Path("HOME/foo.jar"), // library location
new Path("SRC_HOME/foo_src.zip"), //source archive location
new Path("SRC_ROOT"), //source archive root path
true); //exported
JavaCore.setClasspathVariable("HOME", new Path("d:/myInstall"), null); // no progress
Es ist möglich, einen automatischen Initalisierungsoperator für Klassenpfadcontainer zu registrieren, der über den Erweiterungspunkt org.eclipse.jdt.core.classpathContainerInitializer aufgerufen wird, wenn der Container gebunden werden muss.
Der folgende Klassenpfadeintrag gibt einen Container für eine Systemklassenbibliothek an:
IClassPathEntry varEntry = JavaCore.newContainerEntry(
new Path("JDKLIB/default"), // container 'JDKLIB' + hint 'default'
false); //not exported
JavaCore.setClasspathContainer(
new Path("JDKLIB/default"),
new IJavaProject[]{ myProject }, // value for 'myProject'
new IClasspathContainer[] {
new IClasspathContainer() {
public IClasspathEntry[] getClasspathEntries() {
return new IClasspathEntry[]{
JavaCore.newLibraryEntry(new Path("d:/rt.jar"), null, null, false);
};
}
public String getDescription() { return "Basic JDK library container"; }
public int getKind() { return IClasspathContainer.K_SYSTEM; }
public IPath getPath() { return new Path("JDKLIB/basic"); }
}
},
null);
Einem Klassenpfadquelleneintrag kann ein Ausschlussmuster zugeordnet werden, das verhindert, dass bestimmte Ressourcen in einem Quellenordner im Klassenpfad angezeigt werden. Durch Verwenden eines Musters können bestimmte Teile der Ressourcenbaumstruktur herausgefiltert werden. Jeder Pfad eines Ausschlussmusters steht im Verhältnis zum Klassenpfadeintrag und verwendet einen Mustermechanismus ähnlich wie Ant. Mit Hilfe von Ausschlussmustern können verschachtelte Quellenordner angegeben werden, sofern das äußere Muster das innere Muster ausschließt.
Weitere Details zu Ausschlussmustern können Sie unter getExclusionPatterns() nachlesen.
Die Java-Projekt-API isOnClasspath überprüft sowohl die Einschluss- als auch die Ausschlussmuster, bevor sie ermittelt, ob eine bestimmte Ressource im Klassenpfad enthalten ist.
Anmerkungen:
IPath sourceFolder = new Path("/MyProject/src"); IPath outputLocation = sourceFolder.append("bin"); IClassPathEntry srcEntry = JavaCore.newSourceEntry( sourceFolder, // Position des Quellenordners new Path[] { outputLocation }, // ausgeschlossener verschachtelter Ordner outputLocation); // Ausgabeposition
Einem Klassenpfadquelleneintrag kann auch ein Einschlussmuster zugeordnet werden, das die Ressourcen, die im Klassenpfad angezeigt werden sollen, explizit definiert. Werden keine Einschlussmuster angegeben, schließt der Quelleneintrag alle relevanten Dateien in der Ressourcenbaumstruktur ein, deren Stammverzeichnis sich im Pfad des betreffenden Quelleneintrags befindet. Bei Angabe von einem oder mehreren Einschlussmustern werden nur die angegebenen Teile der Ressourcenbaumstruktur eingeschlossen. Jeder angegebene Pfad muss ein relativer Pfad sein und wird relativ zum Pfad des betreffenden Quelleneintrags interpretiert. Bei Dateimustern muss die Groß-/Kleinschreibung beachtet werden. Eine Datei, die mit einem dieser Muster übereinstimmt, wird in das entsprechende Stammverzeichnis für das Paketfragment eingeschlossen, sofern sie nicht durch ein Ausschlussmuster des betreffenden Eintrags ausgeschlossen wird.
Eine Erläuterung der Syntax und Semantik von Pfadmustern finden Sie unter
getExclusionPatterns(). Das
Fehlen von Einschlussmustern ist semantisch äquivalent zum expliziten Einschlussmuster **
.
Die Java-Projekt-API isOnClasspath überprüft sowohl die Einschluss- als auch die Ausschlussmuster, bevor sie ermittelt, ob eine bestimmte Ressource im Klassenpfad enthalten ist.
Beispiele:
src/**
für sich allein schließt alle Dateien unter dem
Stammordner src
ein.
src/**
und tests/**
schließen alle Dateien unter den
Stammordnern src
und tests
ein.
src/**
zusammen mit dem Ausschlussmuster src/**/Foo.java
schließt
alle Dateien unter dem Stammordner src
ein, mit Ausnahme von Dateien mit dem Namen Foo.java
.