В этом разделе описывается настройка пути к классам Java для компоновки (пути компоновки). Путь компоновки - это путь к классам, который используется для компоновки проекта Java (IJavaProject).
Путь к классам - это собой простой массив записей путей к классам (IClassPathEntry), который описывает доступные типы. Типы могут указываться как в исходном, так и в двоичном виде, а последовательность записей в пути компоновки определяет порядок поиска типов для их разрешения (преобразования) во время компоновки.
Путь компоновки Java отображается в структуре элемента проекта Java. Можно запрашивать корневые фрагменты пакетов (IPackageFragmentRoot) проекта. Запись пути к классу преобразуется в один или несколько корневых фрагментов пакета, каждый из которых, в свою очередь, состоит из набора фрагментов пакета.
При обсуждении пути компоновки не рассматривается динамический путь Java, который может быть определен отдельно от пути компоновки. (Динамический путь к классам обсуждается в разделе Выполнение кода Java).
Путь компоновки проекта можно изменить программным образом с помощью
setRawClasspath в соответствующем элементе проекта Java. Следующий
фрагмент кода задает путь к классам для ресурса проекта:
IProject project = ... // получить некоторый ресурс проекта
IJavaProject javaProject = JavaCore.create(project);
IClasspathEntry[] newClasspath = ...;
javaProject.setRawClasspath(newClasspath, someProgressMonitor);
(Примечание: Термин "raw" (исходный, необработанный), относящийся к пути к классу, подчеркивает тот факт, что никакие переменные, применяемые для описания расположений записи, не должны преобразовываться.)
Путь компоновки Java сохраняется в файле с именем '.classpath' в дереве файлов проекта. Этот файл предоставляет возможность распределения параметров путей компоновки Java через некоторое хранилище исходного кода. Во избежание повреждения этого файла его нельзя изменять вручную.
Записи путей к классам можно задать с помощью методов фабрики, определенных в JavaCore. Ниже перечислены объекты, на которые может указывать запись пути к классам:
Ниже приведен пример записи пути к классу, в котором для проекта 'MyProject' задается
папка исходного кода 'src': IClassPathEntry srcEntry = JavaCore.newSourceEntry(new Path("/MyProject/src"));
Ниже приведен пример записи пути к классу, в котором для проекта 'MyProject' для
файлов классов задается папка 'lib':
IClassPathEntry libEntry = JavaCore.newLibraryEntry(
new Path("/MyProject/lib"),
null, //нет исходного кода
null, //нет исходного кода
false); //не экспортирован(а)
Для записи пути к классам существует прикрепленный исходный код:
IClassPathEntry libEntry = JavaCore.newLibraryEntry(
new Path("d:/lib/foo.jar"), // расположение библиотеки
new Path("d:/lib/foo_src.zip"), //расположение архива исходного кода
new Path("src"), //путь к корневому каталогу архива исходного кода
true); //экспортирован(а)
Путь к корневому каталогу исходного кода описывает расположение корневого каталога в архиве исходного кода. Если задан пустой путь, то корневой каталог архива будет вычисляться динамически.
Следующая запись пути к классам обозначает обязательный проект 'MyFramework'.
IClassPathEntry prjEntry = JavaCore.newProjectEntry(new Path("/MyFramework"), true); //экспортируется
Можно зарегистрировать автоматический (automatic) инициализатор переменной пути к классам, который вызывается через точку расширения org.eclipse.jdt.core.classpathVariableInitializer при запуске рабочей области.
Следующая запись пути к классу задает библиотеку, расположение которой хранится в
переменной 'HOME'. Прикрепление исходного кода определяется с помощью переменных
'SRC_HOME' и 'SRC_ROOT' :
IClassPathEntry varEntry = JavaCore.newVariableEntry(
new Path("HOME/foo.jar"), // расположение библиотеки
new Path("SRC_HOME/foo_src.zip"), //расположение архива исходного кода
new Path("SRC_ROOT"), //путь к корневому каталогу архива исходного кода
true); //экспортирована
JavaCore.setClasspathVariable("HOME", new Path("d:/myInstall"), null); // не выполняется
Можно зарегистрировать автоматический инициализатор контейнера путей к классам, который будет вызываться через точку расширения org.eclipse.jdt.core.classpathContainerInitializer при связывании контейнера.
Следующая запись пути к классам определяет контейнер библиотеки системных классов:
IClassPathEntry varEntry = JavaCore.newContainerEntry(
new Path("JDKLIB/default"), // контейнер 'JDKLIB' + указание 'default'
false); //не экспортируется
JavaCore.setClasspathContainer(
new Path("JDKLIB/default"),
new IJavaProject[]{ myProject }, // значение для '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 "Основной контейнер библиотеки JDK"; }
public int getKind() { return IClasspathContainer.K_SYSTEM; }
public IPath getPath() { return new Path("JDKLIB/basic"); }
}
},
null);
Для исходной записи путей к классам можно задать шаблон исключения, который позволяет сделать некоторые ресурсы в папке исходного кода невидимыми для пути к классам. Использование шаблона позволяет отфильтровать определенные части дерева ресурсов. Каждый путь шаблона исключения задается относительно записи пути к классам и использует механизм отбора, подобный Ant. Шаблоны исключения могут использоваться для задания вложенных папок исходного кода, до тех пор пока внутренний шаблон не будет отменен внешним шаблоном.
Дополнительная информация о шаблонах исключений приведена в разделе getExclusionPatterns().
Перед тем как определять, находится ли отдельный ресурс в пути к классам, метод isOnClasspath API проекта Java проверяет и шаблоны включения, и шаблоны исключения.
Замечания:
IPath sourceFolder = new Path("/MyProject/src"); IPath outputLocation = sourceFolder.append("bin"); IClassPathEntry srcEntry = JavaCore.newSourceEntry( sourceFolder, // расположение папки исходного кода new Path[] { outputLocation }, // исключаемая вложенная папка outputLocation); // расположение вывода
Для исходной записи путей к классам можно также задать шаблон включения, который явно определяет ресурсы, видимые в пути к классам. Если не задано ни одного шаблона включения, то исходная запись включает все подходящие файлы в дерево ресурсов, корень которого находится в пути этой исходной записи. Указание одного или нескольких шаблонов включения означает, что будут включены только определенные части дерева ресурсов. Должны указываться только относительные пути, которые будут интерпретироваться относительно данного пути в исходной записи. Шаблоны файлов должны задаваться с учетом регистра символов. Файл, совпадающий с одним или нескольким шаблонами, включается в соответствующий корневой фрагмент пакета, если он не исключен одним или несколькими шаблонами исключения, заданными для данной записи.
Синтаксис и семантика шаблонов путей обсуждаются в разделе
getExclusionPatterns().
Отсутствие каких бы то ни было шаблонов включения семантически эквивалентно явному
шаблону включения **
.
Перед тем как определять, находится ли отдельный ресурс в пути к классам, метод isOnClasspath API проекта Java проверяет и шаблоны включения, и шаблоны исключения.
Примеры:
src/**
включает все файлы в корневой папке с именем src
.
src/**
и tests/**
включают все файлы в
корневых папках с именами src
и tests
.
src/**
вместе с шаблоном исключения
src/**/Foo.java
включает все файлы в корневой папке с именем
src
, за исключением файлов с именем Foo.java
.