簡體   English   中英

從 Eclipse 外部以編程方式列出 Eclipse 工作區中打開的項目

[英]Programmatically list open projects in an eclipse workspace from outside of eclipse

我想編寫一個 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()));
}

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

但是這些文件是自定義的二進制格式在此處輸入圖片說明

是否有我可以調用的 Eclipse API 來解析這些? 或者其他一些解決方案來迭代工作區中的打開項目。

請注意,我想在 eclipse 外部執行此操作,而不是在 eclipse 插件中執行此操作。

閱讀私人描述以獲取位置

由於您是用 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()時測試 M_OPEN
  • 運行時的標志在ResourceInfo.flags
  • 這些標志由從SaveManager.readElement()調用的ResourceInfo.readFrom()加載
  • 傳遞給readElementDataInput input來自存儲在.metadata/.plugins/org.eclipse.core.resources/.root/<id>.tree的工作空間元目錄中的元素樹。 要使用的文件的特定版本(id)記錄在安全表.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources
  • 安全表是部分SaveManager存儲在內部的狀態MasterTable

我已經設法使用作為參考來解析文件

    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();
        }
    }

不幸的是,這似乎無法檢測項目是否已關閉。 任何有關獲取關閉標志的指針將不勝感激

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM