具有适当类路径的Maven插件分叉过程

Jak*_*ton 7 maven-plugin maven

我正在创建一个Maven插件,它具有相当独特的正确操作要求:它需要生成自己的新进程,然后等待这些进程完成任务.

虽然这在命令行上相对简单,但Maven插件不会像传统Java代码那样被调用,因此没有类路径.我无法弄清楚如何在插件中解析正确的类路径,这样我就可以生成一个新的JVM(在插件中调用另一个类的Main方法).

使用当前工件MavenProject我可以获得Artifact对自己(插件)的引用并获取它在本地Maven存储库中的相对目录:

Artifact self = null;
for (Artifact artifact : project.getPluginArtifacts()) {
  if ("my-group-id".equals(artifact.getGroupId()) && "my-artifact-id".equals(artifact.getArtifactId())) {
    self = artifact;
    break;
  }
}
if (self == null) {
  throw new MojoExecutionException("Could not find representation of this plugin in project.");
}
for (ArtifactRepository artifactRepository : project.getPluginArtifactRepositories()) {
  String path = artifactRepository.pathOf(self);
  if (path != null) {
    getLog().info("relative path to self: " + path);
    break;
  }
}
Run Code Online (Sandbox Code Playgroud)

如何获取对其所有依赖项(和传递依赖项)的引用,以便我可以为新调用构造完整的类路径?我看到它self有一个依赖过滤器,但我不知道在哪里应用它.

这是在插件中创建"我自己"的新流程的正确方法吗?有没有更好的办法?

Jak*_*ton 3

我发现了一篇关于 Maven 2 和 Maven 3 依赖解析之间差异的精彩文章。

鉴于Artifact它归结为以下几点:

private Set<Artifact> getDependenciesForArtifact(Artifact artifact) {
  ArtifactResolutionRequest arr = new ArtifactResolutionRequest()
      .setArtifact(artifact)
      .setResolveTransitively(true)
      .setLocalRepository(local);
  return repositorySystem.resolve(arr).getArtifacts();
}
Run Code Online (Sandbox Code Playgroud)

使用 ,您可以通过为每个元素调用 an并加入 来Set构造 a 。pathOfArtifactRepositoryFile.pathSeparator