我在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);
我使用open()
方法打开了IProject,并使用avoiding "resource is out of sync with the filesystem"后面的refreshLocal
手动刷新
我还没有打开其他资源。
我尝试使用“F5”来刷新项目,但它不起作用。
可能有什么问题?我该如何打开资源?
我尝试使用新的NullProgressMonitor()打开资源,但它不起作用。
orig.open(new NullProgressMonitor());
orig.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());
使用这个使用javaModel的代码,我获得了关闭工作空间中所有项目的信息。这是否意味着我的工作区坏了?当我使用eclipse IDE打开工作区时,我可以打开并编译Java代码。
IJavaModel javaModel = JavaCore.create(root);
this.javaProject = javaModel.getJavaProject(this.projectName);
答案 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);
这可能会在以后避免奇怪的错误:)。