我做到了:-)
幫助:有效,聚甲醛和依賴:樹確實不幫助的。
我不得不看看Maven如何爲MavenProject注入mojo的模型。 help:effective-pom已經接收到已解析的模型,並且依賴關係:樹只構建一個DependencyGraph,但它不會將整個模型加載到內存中。
通過使用下面的代碼,我能夠獲得一個Model對象,其中包含來自父級的所有信息,已解析的$ {property}表達式以及擴展的傳遞依賴性。
方法如下:
1)獲取ModelResolver
您需要接口org.apache.maven.model.resolution.ModelResolver的一個實例。 不幸的是,maven不能通過依賴注入輕鬆提供一個(至少我找不到),所以我們必須構建一個。 爲了使事情更好,該接口的唯一兩個實現是包保護的,所以你需要使用一些反射魔法來實例化它。 實現它的具體類是DefaultModelResolver和ProjectModelResolver。 我是能夠建立一個DefaultModelResolver這樣
/**
* The Maven Project Object
*
* @parameter expression="${project}"
* @required2.0
* @readonly
*/
protected MavenProject project;
/**
* @component
*/
protected ArtifactResolver artifactResolver;
/**
* @component
*/
protected RemoteRepositoryManager remoteRepositoryManager;
private Object invoke(Object object, String method)
throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
return object.getClass().getMethod(method).invoke(object);
}
private org.apache.maven.model.resolution.ModelResolver makeModelResolver() throws MojoExecutionException {
try {
ProjectBuildingRequest projectBuildingRequest =
(ProjectBuildingRequest) invoke(project, "getProjectBuildingRequest");
Class c = Class.forName("org.apache.maven.repository.internal.DefaultModelResolver");
Constructor ct = c.getConstructor(new Class[]{RepositorySystemSession.class,
RequestTrace.class, String.class,
ArtifactResolver.class, RemoteRepositoryManager.class,
List.class});
ct.setAccessible(true);
return (org.apache.maven.model.resolution.ModelResolver) ct.newInstance(new Object[]{
projectBuildingRequest.getRepositorySession(),
null, null, artifactResolver, remoteRepositoryManager,
project.getRemoteProjectRepositories()});
} catch (Exception e) {
throw new MojoExecutionException("Error instantiating DefaultModelResolver", e);
}
}
2)建立模型
當你有一個modelResolver,你可以從一個POM文件中像這樣構建模型:
public Model resolveEffectiveModel(File pomfile) {
try {
return modelBuilder.build(makeModelBuildRequest(pomfile)).getEffectiveModel();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private ModelBuildingRequest makeModelBuildRequest(File artifactFile) {
DefaultModelBuildingRequest mbr = new DefaultModelBuildingRequest();
mbr.setPomFile(artifactFile);
mbr.setModelResolver(modelResolver); // <-- the hard-to-get modelResolver
return mbr;
}
看起來不漂亮,但它對我有效..:P
您可以詳細介紹一下驗證規則嗎? – khmarbaise 2012-07-18 13:01:21