无需打开编辑器即可在 Eclipse 插件中获取项目

Get project in Eclipse plugin without having an open editor

在Eclipse插件中很容易获取当前项目(IProject)如果打开了编辑器,你只需要使用这个片段:

IEditorPart editor = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();

IFileEditorInput input = (IFileEditorInput)editor.getEditorInput();
IFile file = input.getFile();
IProject project = file.getProject();

但是,如果我没有在编辑器中打开任何类型的文件,有没有办法获取该项目?即:想象一下,当您右键单击一个项目时,您有一个插件可以添加一个选项,如果单击此选项,将启动一个对话框 window,我如何在此对话框中打印项目名称?

对于使用 'command' 和 'handler' 的菜单项等,您可以在处理程序中使用如下代码:

public class CommandHandler extends AbstractHandler
{
  @Override
  public Object execute(ExecutionEvent event) throws ExecutionException
  {
    ISelection sel = HandlerUtil.getCurrentSelection(event);

    if (sel instanceof IStructuredSelection)
     {
       Object selected = ((IStructuredSelection)sel).getFirstElement();

       IResource resource = (IResource)Platform.getAdapterManager().getAdapter(selected, IResource.class);

       if (resource != null)
        {
          IProject project = resource.getProject();
          ...
        }
     }
    return null;
  }
}

"The current project" 是什么意思?获取特定项目总是需要某种方式来唯一标识那个特定项目。

如果通过 current project 你的意思是该项目是开放的,那么这不是一个很好的唯一性标准(在一般情况下),因为多个项目可以同时开放同时.

唯一定义项目的保证是获取对该项目包含的资源的引用。例如,这可以通过编辑器输入完成,如您所述,或通过选择完成,如 .

如果您有项目名称,那么您可以使用 IWorkspaceRoot#getProject(String),但我认为情况并非如此。尽管如此,为了完整起见:

ResourcesPlugin.getWorkspace().getRoot().getProject("MyProject");

您还可以获得所有项目的列表,并遍历该列表以检查您知道该项目具有的 属性(或项目 具有 ).请参见下面的示例。当然,这在一般情况下也不能保证唯一性,因为可以有多个项目满足条件。这就是我在示例中使用列表的原因。

IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
List<IProject> openProjects = new ArrayList<>();
List<IProject> myNatureProjects = new ArrayList<>();
for(IProject project : projects)
{
    if(project.isOpen())
        openProjects.add(project);
    if(project.hasNature("MyNatureId")
        myNatureProjects.add(project);
}