3

我在 Eclipse 工作区中有一个项目。

在此处输入图像描述

当我使用以下代码将此项目作为 IJavaProject 打开时,我的项目“未打开”。

IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IProject orig = root.getProject(this.projectName);
orig.open(null /* IProgressMonitor */);
orig.refreshLocal(IResource.DEPTH_ZERO, null);
this.javaProject = JavaCore.create(orig);

我用方法打开了 IProject ,并使用以下open()方法手动刷新,避免“资源与文件系统不同步”refreshLocal

在此处输入图像描述

我还有其他资源没有打开。

在此处输入图像描述

我尝试“F5”刷新项目,但它不起作用。

可能有什么问题?如何打开资源?

添加

我尝试使用 new NullProgressMonitor() 打开资源,但没有成功。

orig.open(new NullProgressMonitor());
orig.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());

添加2

通过这段使用 javaModel 的代码,我得到了工作区中所有项目都已关闭的信息。这是否意味着我的工作空间坏了?当我使用 Eclipse IDE 打开工作区时,我可以打开并编译 Java 代码。

IJavaModel javaModel = JavaCore.create(root);
this.javaProject = javaModel.getJavaProject(this.projectName);

在此处输入图像描述

4

1 回答 1

3

代码风格:

您应该尽可能避免使用“null”作为参数。这对于可读性(和可维护性)总是更好。在这里,API 设计者提供了实际的对象来表示“没有价值”:

orig.open(new NullProgressMonitor());
orig.refreshLocal(IResource.DEPTH_ZERO, new NullProgressMonitor());

问题 :

我相信您的问题在于这些行中的第二行:您刷新了项目,但没有刷新它的任何成员。如果您尝试使用 INFINITE 深度以实际刷新所有包含的文件会怎样?

orig.open(new NullProgressMonitor());
orig.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());

更新 :

实际上,资源的 toString 中的这个“(未打开)”不在工作区级别。您的 IProject 和 IFiles 已很好地打开和刷新(如果您的项目已经打开,您可能甚至不需要它)。

Java 模型与工作空间不同,没有被“打开”的 java 元素在工作空间级别没有任何意义,它只意味着没有在 java 元素的内容上打开缓冲区。您不必担心打开 java 元素,jdt 将在您操作其元素期间需要时完成工作。

您可能想要创建整个 java 模型,而不是只创建与项目相对应的模型:

IJavaModel javaModel = JavaCore.create(root);
this.javaProject = javaModel.getJavaProject(this.projectName);

这可能会避免以后出现奇怪的错误:)。

于 2013-01-11T10:59:44.160 回答