W niniejszej sekcji opisano sposób ustawiania ścieżki budowania Java. Ścieżka budowania jest ścieżką klasy używaną do budowania projektu Java (IJavaProject).
Ścieżka klasy jest po prostu tablicą wpisów (IClassPathEntry), które opisują dostępne typy. Typy mogą zostać wyświetlone w formie kodu źródłowego lub binarnej, a kolejność wpisów ścieżki określa porządek wyszukiwania na potrzeby rozpoznawania typów podczas budowania projektu Java.
Ścieżka budowania Java jest odzwierciedlana w strukturze elementów projektu Java. Można tworzyć zapytania o elementy główne fragmentów pakietów projektu (IPackageFragmentRoot). Każdy wpis ścieżki klasy jest odwzorowywany na jeden lub więcej elementów głównych fragmentów pakietów, z których każdy zawiera zestaw fragmentów pakietów.
Niniejsze omówienie dotyczące ścieżki budowania nie dotyczy ścieżki środowiska wykonawczego Java, którą można zdefiniować osobno. (Informacje na temat ścieżki środowiska wykonawczego Java można znaleźć w sekcji Wykonywanie kodu Java).
Ścieżkę budowania projektu można zmienić programowo przy użyciu metody setRawClasspath wywoływanej dla odpowiedniego elementu Java projektu. Następujący kod ustawia ścieżkę klasy dla zasobu projektu:
IProject project = ... // pobieranie zasobu projektu
IJavaProject javaProject = JavaCore.create(project);
IClasspathEntry[] newClasspath = ...;
javaProject.setRawClasspath(newClasspath, someProgressMonitor);
Uwaga: Termin "surowa" ścieżka klasy jest stosowany w celu położenia nacisku na fakt, że żadne zmienne używane w danym wpisie do opisu położeń nie zostały jeszcze zinterpretowane.
Ścieżka budowania Java jest utrwalana w pliku o nazwie .classpath w strukturze plików projektu. Dzięki temu plikowi różni użytkownicy mogą współużytkować ustawienia ścieżki budowania Java za pośrednictwem repozytorium kodu źródłowego. Ten plik nie powinien być edytowany ręcznie, ponieważ mógłby zostać uszkodzony.
Wpisy ścieżki klasy mogą być definiowane przy użyciu metod fabryki zdefiniowanych w klasie JavaCore. Wpisy ścieżki klasy mogą odwoływać się do dowolnego z następujących elementów:
Następujący przykładowy wpis ścieżki klasy oznacza folder src projektu MyProject:
IClassPathEntry srcEntry = JavaCore.newSourceEntry(new Path("/MyProject/src"));
Następujący przykładowy wpis ścieżki klasy oznacza folder lib pliku CLASS projektu MyProject:
IClassPathEntry libEntry = JavaCore.newLibraryEntry(
new Path("/MyProject/lib"),
null, //brak źródła
null, //brak źródła
false); //niewyeksportowane
Następujący wpis ścieżki klasy ma załącznik z kodem źródłowym:
IClassPathEntry libEntry = JavaCore.newLibraryEntry(
new Path("d:/lib/foo.jar"), // położenie biblioteki
new Path("d:/lib/foo_src.zip"), //położenie archiwum źródeł
new Path("src"), //ścieżka główna archiwum źródeł
true); //wyeksportowane
Ścieżka główna archiwum kodu źródłowego opisuje położenie elementu głównego w tym archiwum. W przypadku ustawienia wartości NULL, położenie elementu głównego archiwum będzie ustalane dynamicznie.
Następujący wpis ścieżki klasy oznacza wymagany wstępnie projekt MyFramework.
IClassPathEntry prjEntry = JavaCore.newProjectEntry(new Path("/MyFramework"), true); //wyeksportowane
Istnieje możliwość zarejestrowania automatycznego inicjatora zmiennej ścieżki klasy, który jest wywoływany przez punkt rozszerzenia org.eclipse.jdt.core.classpathVariableInitializer, kiedy obszar roboczy jest uruchamiany.
Następujący wpis ścieżki klasy oznacza bibliotekę, której położenie jest przechowywane w zmiennej HOME. Załącznik kodu źródłowego jest definiowany przy użyciu zmiennych SRC_HOME i SRC_ROOT:
IClassPathEntry varEntry = JavaCore.newVariableEntry(
new Path("HOME/foo.jar"), // położenie biblioteki
new Path("SRC_HOME/foo_src.zip"), //położenie archiwum źródeł
new Path("SRC_ROOT"), //ścieżka główna archiwum źródeł
true); //wyeksportowane
JavaCore.setClasspathVariable("HOME", new Path("d:/myInstall"), null); // brak postępu
Istnieje możliwość zarejestrowania automatycznego inicjatora kontenera wpisu ścieżki, który jest wywoływany z opóźnieniem przez punkt rozszerzenia org.eclipse.jdt.core.classpathContainerInitializer, kiedy kontener musi zostać powiązany.
Następujący wpis ścieżki klasy oznacza kontener systemowej biblioteki klas:
IClassPathEntry varEntry = JavaCore.newContainerEntry(
new Path("JDKLIB/default"), // kontener JDKLIB + wskazówka default
false); //niewyeksportowane
JavaCore.setClasspathContainer(
new Path("JDKLIB/default"),
new IJavaProject[]{ myProject }, // wartość dla elementu 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);
Do wpisu ścieżki klasy dotyczącego kodu źródłowego może zostać przypisany wzorzec wykluczania, który uniemożliwia wyświetlanie w ścieżce klasy określonych zasobów z folderu źródłowego. Użycie wzorca umożliwia odfiltrowanie określonych części drzewa zasobów. Ścieżka każdego wzorca wykluczenia jest określona względem wpisu ścieżki klasy i korzysta z mechanizmu wzorca podobnego do narzędzia Ant. Wzorce wykluczenia mogą być używane do określania zagnieżdżonych folderów źródłowych, dopóki wzorzec wewnętrzny jest wykluczany przez wzorzec zewnętrzny.
Więcej szczegółowych informacji na temat wzorców wykluczenia można znaleźć w opisie metody getExclusionPatterns().
W celu określenia, czy konkretny zasób został uwzględniony w ścieżce klasy, metoda isOnClasspath interfejsu API projektu Java sprawdza najpierw wzorce włączenia i wykluczenia.
Uwagi:
IPath sourceFolder = new Path("/MyProject/src"); IPath outputLocation = sourceFolder.append("bin"); IClassPathEntry srcEntry = JavaCore.newSourceEntry( sourceFolder, // położenie folderu źródłowego new Path[] { outputLocation }, // wykluczony folder zagnieżdżony outputLocation); // położenie danych wyjściowych
Do wpisu ścieżki klasy źródła może również zostać przypisany wzorzec włączania, jednoznacznie definiujący zasoby, które mają być widoczne w ścieżce klasy. Jeśli żadne wzorce włączania nie zostały określone, wpis źródła zawiera wszystkie stosowne pliki drzewa zasobów, którego węzeł główny znajduje się w ścieżce tego wpisu źródła. Określenie jednego lub większej liczby wzorców włączenia oznacza, że włączone mają być tylko określone części drzewa zasobów. Każda określona ścieżka musi być ścieżką względną i będzie interpretowana względem ścieżki tego wpisu źródła. We wzorcach plików jest rozróżniana wielkość liter. Plik zgodny z jednym lub kilkoma z tych wzorców jest włączony w odpowiednim elemencie głównym fragmentu pakietu, o ile nie jest wykluczony przez jeden lub więcej wzorców wykluczenia przypisanych do wpisu.
Patrz opis metody getExclusionPatterns(), aby zapoznać się ze składnią i semantyką wzorców ścieżek. Nieobecność któregokolwiek z wzorców włączenia jest pod względem semantycznym równoznaczna z bezpośrednim wzorcem włączenia **
.
W celu określenia, czy konkretny zasób został uwzględniony w ścieżce klasy, metoda isOnClasspath interfejsu API projektu Java sprawdza najpierw wzorce włączenia i wykluczenia.
Przykłady:
src/**
włącza wszystkie pliki w folderze głównym o nazwie src
.
src/**
i tests/**
włączają wszystkie pliki w folderach głównych o nazwach src
i tests
.
src/**
razem z wzorcem wykluczenia src/**/Foo.java
włącza wszystkie pliki w folderze głównym o nazwie src
z wyjątkiem tych o nazwie Foo.java
.