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 Laufzeitklassenpfads finden Sie unter Java-Code ausführen.
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 = ... // eine Projektressource abrufen
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.Der Zweck dieser Datei ist es, eine Möglichkeit zur gemeinsamen Nutzung der Einstellungen des Java-Erstellungspfads über einige Quellcode-Repositorys zur Verfügung zu stellen. 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, // keine Quelle
null, // keine Quelle
false); // nicht exportiert
Dem folgenden Klassenpfadeintrag ist eine Quelle zugeordnet:
IClassPathEntry libEntry = JavaCore.newLibraryEntry(
new Path("d:/lib/foo.jar"), // Position der Bibliothek
new Path("d:/lib/foo_src.zip"), // Position des Quellenarchivs
new Path("src"), // Stammpfad des Quellenarchivs
true); // exportiert
Der Stammverzeichnispfad des Quellenarchivs beschreibt die Position des Stammverzeichnisses innerhalb des Quellenarchivs.Lautet die Einstellung Null, wird das Stammverzeichnis des Archivs dynamisch erschlossen.
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 bezeichnet eine Bibliothek, 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"), // Position der Bibliothek
new Path("SRC_HOME/foo_src.zip"), // Position des Quellenarchivs
new Path("SRC_ROOT"), // Stammpfad des Quellenarchivs
true); // exported
JavaCore.setClasspathVariable("HOME", new Path("d:/myInstall"), null); // no progress monitor
Es ist möglich, einen automatischen Initialisierungsoperator 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' + Hinweis 'Standard'
false); // nicht exportiert
JavaCore.setClasspathContainer(
new Path("JDKLIB/default"),
new IJavaProject[]{ myProject }, // Wert für '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 finden Sie unter getExclusionPatterns.
Die Java-Projekt-API isOnClasspath überprüft sowohl die Einschluss- als auch die Ausschlussmuster, bevor festgelegt wird, ob eine bestimmte Ressource sich im Klassenpfad befindet.
Anmerkungen:
IPath sourceFolder = new Path("/MyProject/src"); IPath outputLocation = sourceFolder.append("bin"); IClassPathEntry srcEntry = JavaCore.newSourceEntry( sourceFolder, // Position des Quellenordners new Path[] { outputLocation }, // verschachtelten Ordner ausschließen outputLocation); // Position der Ausgabe
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. Die Angabe von einem oder mehreren Einschlussmustern bedeutet, dass nur die angegebenen Teile der Ressourcenbaumstruktur eingeschlossen werden sollen. Jeder angegebene muss ein relativer Pfad sein und wird relativ zum Pfad dieses 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 festgelegt wird, ob eine bestimmte Ressource sich im Klassenpfad befindet.
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
.