【问题标题】:Maven Plugin Fork Process With Proper Classpath具有正确类路径的 Maven 插件分叉过程
【发布时间】:2012-12-26 09:56:34
【问题描述】:

我正在创建一个 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 maven-plugin


    【解决方案1】:

    我在 Maven 2 和 Maven 3 上的依赖解析之间的差异上找到了 a great article

    给定一个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 连接来构造a。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我与之交互的第三方服务只允许每个进程有一个连接并且不能连续执行它们。我需要在这个插件的一次运行中进行 5 到 20 次交互。稍后我会调查您的建议,谢谢。
      猜你喜欢
      • 1970-01-01
      • 2015-07-07
      • 2011-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多