从 IJavaProject 或 IProject 获取 org.apache.maven.model.Model

Get from IJavaProject or IProject to org.apache.maven.model.Model

我在 org.eclipse.core.commands.AbstractHandlerexecute 实现方法中。从 ExecutionEvent 我可以得到项目参考:

@Override
public Object execute(ExecutionEvent event) throws ExecutionException
{
    TreeSelection selection = (TreeSelection)HandlerUtil.getCurrentSelection(event);
    IJavaElement je = (IJavaElement)selection.getFirstElement()
    IJavaProject jproj = je.getJavaProject();
    IProject p = (IProject)jproj.getResource();
    //...
}

通过核心表达式,我确保项目具有 java 和 maven 特性。所以我想从那个项目中得到一个 Maven 模型。当然有一种方法可以从文件中获取它:

MavenXpp3Reader mReader = new MavenXpp3Reader();
Model pomModel = mReader.read(p.getFile("pom.xml").getContents());

但是由于我可以访问工作区,所以我不确定是否真的需要自己阅读 POM 文件。我认为它应该已经被 m2eclipse 插件评估过。有没有办法以某种方式访问​​项目的maven模型?

我发现有一个 maven 项目注册表,它保留了工作区的所有已知 maven 项目。在它的帮助下,我无需手动阅读 POM 即可进入 Maven 模型:

public Object execute(ExecutionEvent event) throws ExecutionException
{
    TreeSelection selection = (TreeSelection)HandlerUtil.getCurrentSelection(event);
    IJavaElement je = (IJavaElement)selection.getFirstElement();
    IJavaProject jproj = je.getJavaProject();
    IProject proj = (IProject)jproj.getResource();
    IMavenProjectFacade facade = MavenPlugin.getMavenProjectRegistry().getProject(proj);
    Model mavenModel = facade.getMavenProject().getModel();
    //...
    return null;
}

编辑: IMavenProjectFacade#getMavenProject() 的用法不是 null 安全的。如果 m2eclipse 还没有将引用的项目加载到它的缓存中(即在 eclipse 启动之后),它将 return 为空。这就是为什么最好使用 IMavenProjectFacade#getMavenProject(IProgressMonitor monitor),它根据 javadocs.

执行 "lazy load and cache MavenProject instance"