【问题标题】:Why eclipse resource is "(not open)"?为什么eclipse资源是“(未打开)”?
【发布时间】:2013-01-10 15:03:04
【问题描述】:

我在 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”刷新项目,但它不起作用。

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

添加

我尝试使用 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);

【问题讨论】:

    标签: java eclipse eclipse-plugin


    【解决方案1】:

    代码风格:

    您应该尽可能避免使用“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中的这个“(not open)”不在工作区级别。您的 IProject 和 IFile 已很好地打开和刷新(如果您的项目已经打开,您可能甚至不需要它)。

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

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

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

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

    【讨论】:

    • 我尝试使用“IResource.DEPTH_INFINITE, new NullProgressMonitor()”,但仍然无法打开资源。
    • 好的,你的问题实际上不在资源级别:)。您的项目实际上已正确打开,并且资源已刷新。一分钟后更新答案:)。
    • 使用 javaModel 显示我在工作区中的所有项目都没有打开。这是否意味着我的工作区有问题?我更新了我的 OP。谢谢。
    • 如上所述,您现在必须担心文件的“打开”状态。当您使用这些元素时,jdt 将在需要时打开它们。请阅读 IOpenable#open() 的 javadoc 和相关建议(网页版:phpeclipse.com/browser/net.sourceforge.phpeclipse/src/net/…
    • 你现在必须担心文件的“打开”状态 --> 我想应该是“现在不必...”,这意味着我不需要不再需要“orig.open()”了。
    猜你喜欢
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    相关资源
    最近更新 更多