在我的插件中,我需要处理依赖关系层次结构并获取有关每个依赖关系的信息(groupId,artifactId,version等)以及它是否被排除.做这个的最好方式是什么?
我正在编写一个 Maven 插件,它对 Maven 项目中的依赖项进行分析。对于此分析,我需要将项目依赖项传递到文件中。基本上,我需要项目直接或间接使用的所有 JAR 作为本地文件,以便我的插件可以分析它们。
如何在现代 (~3.3.x) Maven 中做到这一点?
我在早期版本中所做的是:
注入了大量的组件和参数。
@Component
protected ArtifactResolver artifactResolver;
@Component
protected ArtifactMetadataSource artifactMetadataSource;
@Component
protected ArtifactFactory artifactFactory;
@Parameter(defaultValue="${localRepository}", required=true, readonly=true)
protected ArtifactRepository localRepository;
@Component(role=MavenProjectBuilder.class)
protected MavenProjectBuilder mavenProjectBuilder;
@Component
protected ArtifactGraphBuilder artifactGraphBuilder;
@Parameter(defaultValue="${project.remoteArtifactRepositories}", required = true, readonly = true)
protected List<ArtifactRepository> remoteArtifactRepositories;
@Parameter( defaultValue = "${project}", readonly = true)
protected MavenProject project;
Run Code Online (Sandbox Code Playgroud)
从依赖项创建工件:
final Set<Artifact> dependencyArtifacts =
MavenMetadataSource.createArtifacts(artifactFactory,
project.getDependencies(), "compile", null, project);
Run Code Online (Sandbox Code Playgroud)
使用ArtifactResolver来传递解决工件:
artifactResolver.resolveTransitively(artifacts, originatingArtifact,
managedVersions, localRepository, remoteRepositories,
artifactMetadataSource, filter, moreListeners); …Run Code Online (Sandbox Code Playgroud) 我正在编写一个Maven插件来获取已解析的依赖项.它适用于单个模块项目/ pom,但在多个模块项目上失败.
这是一段代码片段
@Mojo(
name="scan",
aggregator = true,
defaultPhase = LifecyclePhase.COMPILE,
threadSafe = true,
requiresDependencyCollection = ResolutionScope.TEST,
requiresDependencyResolution = ResolutionScope.TEST,
requiresOnline = true
)
public class MyMojo extends AbstractMojo {
@Parameter(property = "project", required = true, readonly = true)
private MavenProject project;
@Parameter(property = "reactorProjects", required = true, readonly = true)
private List<MavenProject> reactorProjects;
@Override
public void execute() throws MojoExecutionException {
for(MavenProject p : reactorProjects) {
for(Artifact a : p.getArtifacts()) {
...consolidate artifacts
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码将整合所有模块中所有已解析的依赖项,但它包含一些额外的依赖项.
这是一个可以使用的示例项目.请下载此github …