やったよ :-)
help:effective-pom と dependency:tree は実際にはまったく役に立ちませんでした。
モジョに注入されるMavenProjectのモデルをmavenがどのように構築するかを調べる必要がありました。help:effective-pom は既に解決済みのモデルを受け取り、dependency:tree は DependencyGraph のみを構築しますが、pom のモデル全体をメモリにロードしません。
以下のコードを使用することで、親からのすべての情報、解決された ${property} 式、および展開された推移的な依存関係を含む Model オブジェクトを取得できました。
方法は次のとおりです。
1) ModelResolver を取得する
インターフェイス org.apache.maven.model.resolution.ModelResolverのインスタンスが必要になります。残念ながら、maven は依存性注入を介して簡単に提供しないため (少なくとも私は見つけることができませんでした)、作成する必要があります。さらに良いことに、そのインターフェースの 2 つの実装のみがパッケージで保護されているため、リフレクション マジックを使用してインスタンス化する必要があります。それを実装する具体的なクラスは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