【问题标题】:How can I call Maven programmatically from within a plugin without using a process invocation?如何在不使用进程调用的情况下从插件中以编程方式调用 Maven?
【发布时间】:2012-07-17 19:15:33
【问题描述】:

我想从插件中调用 Maven 目标,并且不愿意接受将分叉进程作为初始化的成本。有没有办法做到这一点?

【问题讨论】:

  • 问题是你为什么需要它?为什么不使用 Maven 的生命周期?
  • @khmarbaise 以 Maven 发布插件为例 - 它分叉 Maven,因为它需要控制生命周期,并且需要对从 SCM 签出的任意项目进行操作。我的插件也执行发布。不幸的是,我无法使用 Maven 发布插件,因为它与我们的“AccuRev”SCM 软件的交互很不稳定,而且它在其他地方也有一两个错误。
  • Maven Release Plugin 使用 Maven-Invoker-Plugin 在后台运行 maven。此外,为什么不从头开始修复 AccuRev 的 SCM 提供程序的错误?
  • @khmarbaise 理想情况下,我会修复 OSS 项目,但我不是经验丰富的 OSS 提交者,也没有对项目的提交访问权限(并且在截止日期前)。不仅如此,我们的发布流程也非常专业,可以更轻松地推出我们自己的发布流程。
  • 但是您可以将一些问题放入跟踪系统 (JIRA)。在您开始发送补丁之前,您永远不会获得 OSS 提交者……但在系统中提交问题就足够了。此外,我们总是在每个项目的最后期限内;-)

标签: maven maven-plugin maven-3


【解决方案1】:

我怀疑这是一种受支持的方法,但它对我有用。

/**
 * @parameter expression="${session}"
 * @required
 * @readonly
 */
 private MavenSession session;

/**
 * @component
 * @readonly
 */
 private Maven maven;
/**
 * @parameter default-value="${project.remoteArtifactRepositories}"
 * @readonly
 **/
protected List<ArtifactRepository> remoteArtifactRepositories;
/**
 * The project's remote repositories to use for the resolution of plugins
 * and their dependencies.
 * 
 * @parameter default-value="${project.pluginArtifactRepositories}"
 * @readonly
 */
private List<ArtifactRepository> pluginArtifactRepositories;
/**
 * @parameter default-value="${localRepository}"
 * @readonly
 * */
private ArtifactRepository localRepository;

...

List<String> goals = ...
File pomFile = ...
MavenExecutionRequest req = new DefaultMavenExecutionRequest();
req.setPom(pomFile);
req.setBaseDirectory(pomFile.getParentFile());
req.setGoals(goals);
req.setProxies(session.getSettings().getProxies());
req.setMirrors(session.getSettings().getMirrors());
req.setLocalRepository(localRepository);
req.setRemoteRepositories(remoteArtifactRepositories);
req.setPluginArtifactRepositories(pluginArtifactRepositories);
MavenExecutionResult result = session.execute(req);

要内省处理,您可以继承 AbstractExecutionListener 并使用 req.setExecutionListener() 来应用它。

【讨论】:

  • 我试过了,但找不到初始化这些接口的方法。就像创建 Maven 会话一样,需要一个 plexus 容器,它是一个接口。
【解决方案2】:

【讨论】:

  • 我确实玩过这个,但初始化每个插件运行似乎需要一段时间,因此似乎是分叉。使用我的答案中的代码运行似乎更快。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-15
  • 1970-01-01
  • 1970-01-01
  • 2012-09-06
  • 2012-08-12
  • 1970-01-01
相关资源
最近更新 更多