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;
  }
}

如何获得对其所有依赖关系(以及传递依赖关系)的引用,以便可以为新的调用构建完整的类路径? 我看到self有一个依赖过滤器,但我不知道应用在哪里。

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


我发现了一篇关于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();
}

通过Set您可以通过在ArtifactRepository为每个元素调用pathOf并使用File.pathSeparator连接来构造一个。


嗯。 不是一个真正的答案,而是一些提示。 你为什么需要这么复杂的东西? 此外,我将深入研究maven-surefire插件,它可以为单元测试分叉jvm并可以处理类路径。 另一方面,你可以看看maven-invoker或maven-invoker-plugin,它可以完全分开maven。 啊..我错过了。 看一看Maven-dependency-plugin,它具有创建类路径的特定目标,您可以在其中查看构建类路径的源代码。

链接地址: http://www.djcxy.com/p/67963.html

上一篇: Maven Plugin Fork Process With Proper Classpath

下一篇: Recommendations for MongoDB schema design