本节描述如何设置 Java 构建路径。构建路径是用于构建 Java 项目(IJavaProject)的类路径。
类路径只是一组用于描述可用类型的类路径条目(IClassPathEntry)。类型能够以源或二进制格式出现,并且条目在路径中的顺序定义了用于在构建期间解析类型的查找顺序。
Java 构建路径反映在 Java 项目元素的结构中。可以查询项目的包段根目录(IPackageFragmentRoot)。每个类路径条目都映射至一个或多个包段根目录,每个包段根目录进一步包含一组包段。
此处对构建路径的讨论不涉及 Java 运行时路径,Java 运行时路径可以独立于构建路径进行定义。(有关对运行时类路径的讨论,请参阅运行 Java 代码。)
可以通过对相应项目的 Java 元素使用
setRawClasspath
来使用程序更改项目的构建路径。以下代码设置项目资源的类路径:
IProject project = ... // get some project resource
IJavaProject javaProject = JavaCore.create(project);
IClasspathEntry[] newClasspath = ...;
javaProject.setRawClasspath(newClasspath, someProgressMonitor);
(注意:术语“原始”类路径用来强调尚未解析任何用来描述条目位置的变量的事实。)
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, //no source
null, //no source
false); //not exported
以下类路径条目具有源代码连接:
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
源归档根路径描述根在源归档中的位置。如果设置为空,则将动态地推断归档的根。
以下类路径条目指示先决条件项目“MyFramework”。
IClassPathEntry prjEntry = JavaCore.newProjectEntry(new Path("/MyFramework"), true); //exported
可能会注册自动的类路径变量初始化方法,当启动工作空间时,通过扩展点 org.eclipse.jdt.core.classpathVariableInitializer 来调用该类路径变量初始化方法。
以下类路径条目指示一个库,该库的位置存放在变量“HOME”中。使用变量“SRC_HOME”和“SRC_ROOT”来定义源代码连接:
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
可能会注册一个自动的类路径容器初始化方法,当需要绑定容器时,通过扩展点 org.eclipse.jdt.core.classpathContainerInitializer 来被动地调用类路径容器初始化方法。
以下类路径条目指示系统类库容器:
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);
可以对类路径源条目指定排除模式,排除模式防止源文件夹中的特定资源在类路径中可见。对模式的使用允许过滤掉资源树的指定部分。每个排除模式路径都是相对于类路径条目的,并且使用与 Ant 相似的模式机制。只要外部模式排除内部模式,排除模式就可以用来指定嵌套的源文件夹。
关于排除模式的更多详细信息,请参阅 getExclusionPatterns()。
Java 项目 API isOnClasspath 在确定特定资源是否在类路径上之前将检查包括和排除模式。
注释:
IPath sourceFolder = new Path("/MyProject/src"); IPath outputLocation = sourceFolder.append("bin"); IClassPathEntry srcEntry = JavaCore.newSourceEntry( sourceFolder, // source folder location new Path[] { outputLocation }, // excluded nested folder outputLocation); // output location
也可以对类路径源条目指定包含模式,这显式地将资源定义为在类路径中是可视的。当未指定包含模式时,则源条目包括以此源条目的路径为根的资源树中的所有相关文件。指定一个或多个包括模式意味着只能包含资源树的指定部分。每个指定的路径都必须是相对路径,并且将解释为相对于此源条目的路径。文件模式是区分大小写的。通过这些模式中的一个或多个模式匹配 的文件将包括在相应的包段中根目录中,除非它被此条目的一个或多个排除模式排除。
请参阅 getExclusionPatterns()
以获取路径模式的语法和语义的论述。缺少任何包括模式在语义上等同于显式包括模式 **
。
Java 项目 API isOnClasspath 在确定特定资源是否在类路径上之前将检查包括和排除模式。
示例:
src/**
本身包括名为 src
的根文件夹下的所有文件。
src/**
和 tests/**
包括名为 src
和 tests
的根文件夹下的所有文件。
src/**
与排除模式 src/**/Foo.java
一起包括名为
src
的根文件夹下的所有文件(除了名为 Foo.java
的文件)。