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

时间:2015-11-23 10:03:46

标签: java eclipse eclipse-plugin m2eclipse eclipse-jdt

我在execute实施的org.eclipse.core.commands.AbstractHandler方法内。从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模型吗?

1 个答案:

答案 0 :(得分:1)

我发现有一个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()的使用不是空的安全。如果m2eclipse尚未将引用的项目加载到其缓存中(即在eclipse启动之后),它将返回null。这就是为什么最好使用IMavenProjectFacade#getMavenProject(IProgressMonitor monitor)根据javadocs“延迟加载和缓存MavenProject实例”。