为什么eclipse资源是“(不开放)”?

时间:2013-01-10 15:03:05

标签: java eclipse eclipse-plugin

我在eclipse工作区有一个项目。

enter image description here

当我使用以下代码以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);

我使用open()方法打开了IProject,并使用avoiding "resource is out of sync with the filesystem"后面的refreshLocal手动刷新

enter image description here

我还没有打开其他资源。

enter image description here

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

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

ADDED

我尝试使用新的NullProgressMonitor()打开资源,但它不起作用。

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

ADDED2

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

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

enter image description here

1 个答案:

答案 0 :(得分: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);

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