我想编写一个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()));
}
我查看了我的工作区,可以看到.location
c:\myEclipseWorkspace\.metadata\.plugins\org.eclipse.core.resources\.projects\
个文件
我是否可以调用eclipse API来解析这些?或者其他一些解决方案来迭代工作区中的打开项目。
请注意,我想在eclipse外部执行此操作,而不是在eclipse插件中执行此操作。
答案 0 :(得分:3)
由于您是用Java编写的,因此请重用外部位置的Eclipse代码。
即。从org.eclipse.core.resources.ResourcesPlugin
中提取一些关键代码。从org.eclipse.core.resources.ResourcesPlugin.getWorkspace()
的impl开始,然后前往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
是表示项目已打开或关闭的标志值(设置为打开,清除为关闭)Project.isOpen()
ResourceInfo.flags
ResourceInfo.readFrom()
SaveManager.readElement()
加载
input
的{{3}} readElement
来自.metadata/.plugins/org.eclipse.core.resources/.root/<id>.tree
中工作空间元目录中存储的元素树。要使用的文件的特定版本(id)记录在安全表.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources
DataInput
SaveManager
内部状态的一部分
答案 1 :(得分:1)
我设法使用this作为参考来解析文件
protected Location parseLocation(File locationFile) throws IOException {
String name = locationFile.getParentFile().getName();
DataInputStream in = new DataInputStream(new FileInputStream(locationFile));
try {
in.skip(ILocalStoreConstants.BEGIN_CHUNK.length);
String path = in.readUTF();
int numRefs = in.readInt();
String[] refNames = new String[numRefs];
for (int i = 0; i < numRefs; ++ i) {
refNames[i] = in.readUTF();
}
in.skipBytes(ILocalStoreConstants.END_CHUNK.length);
return new Location(name, path, refNames);
} finally {
in.close();
}
}
不幸的是,这似乎无法检测项目是否已关闭。关于获得封闭旗帜的任何指示都将非常感激