当可以解析 Eclipse IJavaProject 的类路径时获得通知
Get notified when an Eclipse IJavaProject's classpath can be resolved
我正在开发一个 Eclipse 插件,它在启动时需要遍历工作区中所有打开的 Java 项目,获取每个已解析的类路径并对其进行处理。到目前为止我的代码看起来像这样:
public void start(BundleContext context) throws Exception {
for (IProject project : ResourcesPlugin.getWorkspace().getRoot().getProjects()) {
if (project.isOpen() && project.getNature(JavaCore.NATURE_ID) != null) {
IJavaProject javaProject = JavaCore.create(project);
for (IClasspathEntry cpe : javaProject.getResolvedClasspath(true)) {
// Do something with cpe
}
}
}
}
问题是,对于工作区中的某些项目,IJavaProject.getResolvedClasspath(true)
最初 return 是一个空类路径。我的猜测是这些项目尚未完全加载。
我还有一个 IResourceChangeListener
用于侦听项目 opening/closing 并执行与启动时相同的操作。当我关闭并重新打开最初具有空类路径的项目时,IJavaProject.getResolvedClasspath(true)
将 return 预期的类路径。
我的假设是否正确,这些项目尚未完全加载?我应该如何重新设计它以便在我的插件启动时为所有 Java 项目获得正确解析的类路径?
我自己从 Eclipse JDT 源代码中弄清楚了。如果类路径由另一个线程解析,IJavaProject.getResolvedClasspath(boolean)
确实可以 return 一个空类路径。在尝试获取项目的已解析类路径之前添加对 JavaCore.initializeAfterLoad(IProgressMonitor)
的调用似乎可以解决问题。
我正在开发一个 Eclipse 插件,它在启动时需要遍历工作区中所有打开的 Java 项目,获取每个已解析的类路径并对其进行处理。到目前为止我的代码看起来像这样:
public void start(BundleContext context) throws Exception {
for (IProject project : ResourcesPlugin.getWorkspace().getRoot().getProjects()) {
if (project.isOpen() && project.getNature(JavaCore.NATURE_ID) != null) {
IJavaProject javaProject = JavaCore.create(project);
for (IClasspathEntry cpe : javaProject.getResolvedClasspath(true)) {
// Do something with cpe
}
}
}
}
问题是,对于工作区中的某些项目,IJavaProject.getResolvedClasspath(true)
最初 return 是一个空类路径。我的猜测是这些项目尚未完全加载。
我还有一个 IResourceChangeListener
用于侦听项目 opening/closing 并执行与启动时相同的操作。当我关闭并重新打开最初具有空类路径的项目时,IJavaProject.getResolvedClasspath(true)
将 return 预期的类路径。
我的假设是否正确,这些项目尚未完全加载?我应该如何重新设计它以便在我的插件启动时为所有 Java 项目获得正确解析的类路径?
我自己从 Eclipse JDT 源代码中弄清楚了。如果类路径由另一个线程解析,IJavaProject.getResolvedClasspath(boolean)
确实可以 return 一个空类路径。在尝试获取项目的已解析类路径之前添加对 JavaCore.initializeAfterLoad(IProgressMonitor)
的调用似乎可以解决问题。