以编程方式从eclipse外部列出eclipse工作区中的打开项目

lan*_*ava 10 java eclipse workspace parsing

我想编写一个Gradle插件,它可以检查eclipse工作区目录并迭代工作区内的打开项目并确定每个项目的位置.

就像是

Workspace workspace = EclipseUtils.parseWorkspace("c:/myEclipseWorkspace");
Collection<Project> projects = workspace.getProjects();
for (Project project : projects) {
   System.out.println(String.format("name=%s, location=%s, open=%s",
      project.getName(), project.getLocation(), project.isOpen()));
}
Run Code Online (Sandbox Code Playgroud)

我查看了我的工作区,可以看到一些.location文件c:\myEclipseWorkspace\.metadata\.plugins\org.eclipse.core.resources\.projects\

但这些文件是自定义二进制格式 在此输入图像描述

是否有一个eclipse API,我可以调用它来解析这些?或者一些其他解决方案来迭代工作空间中的打开项目.

请注意,我想在eclipse外部执行此操作,而不是在eclipse插件中执行此操作.

Jon*_*ham 5

阅读私人描述以获取位置

由于您是用 Java 编写的,因此可以重用外部位置的 Eclipse 代码。

即从 中拉出一些关键代码org.eclipse.core.resources.ResourcesPlugin。从实现开始,org.eclipse.core.resources.ResourcesPlugin.getWorkspace()然后按照自己的方式工作org.eclipse.core.resources.IWorkspaceRoot.getProjects()

上面的代码在这里读取了项目描述:org.eclipse.core.internal.resources.LocalMetaArea.readPrivateDescription(IProject, ProjectDescription)并且从org.eclipse.core.internal.localstore.FileSystemResourceManager.read(IProject, boolean)它调用了一些关于默认位置的逻辑。

这就是 EPL 的乐趣,只要您的新程序/功能是 EPL,您就可以重用 Eclipse 的核心代码来做新奇的事情。

读取工作区状态以获取打开/关闭状态

读取工作区状态时,您正在进入ElementTree数据结构。在不使用 ElementTree 类的情况下阅读本文可能是不现实的。在没有完整 OSGi 的情况下使用 ElementTree 类可能是不现实的。我提供以下说明以帮助您。

向后工作:

  • ICoreConstants.M_OPEN 是指示项目是打开还是关闭的标志值(设置为打开,清除为关闭)
  • M_OPEN 在Project.isOpen()被调用时测试
  • 运行时的标志在 ResourceInfo.flags
  • 这些标志是通过ResourceInfo.readFrom()调用从SaveManager.readElement()
  • 在传递到与存储在工作区中的元目录元素树。要使用的文件的特定版本(id)记录在安全表中DataInput inputreadElement.metadata/.plugins/org.eclipse.core.resources/.root/<id>.tree.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources
  • 安全表是SaveManager内部状态的一部分,存储在MasterTable