如何从插件中以编程方式调用Maven而不使用流程调用?

如何从插件中以编程方式调用Maven而不使用流程调用?,maven,maven-plugin,maven-3,Maven,Maven Plugin,Maven 3,我想从插件中调用Maven goals,但不愿意接受作为初始化过程的分叉成本。有什么方法可以做到这一点吗?我怀疑这是一种受支持的方法,但它对我有效 /** * @parameter expression="${session}" * @required * @readonly */ private MavenSession session; /** * @component * @readonly */ private Maven maven; /** * @paramet

我想从插件中调用Maven goals,但不愿意接受作为初始化过程的分叉成本。有什么方法可以做到这一点吗?

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

/**
 * @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;
/**
*@parameter expression=“${session}”
*@必需
*@readonly
*/
非公开会议;
/**
*@组件
*@readonly
*/
私人马文马文;
/**
*@parameter default value=“${project.remoteArtifactRepositories}”
*@readonly
**/
受保护列表库;
/**
*用于解析插件的项目的远程存储库
*以及它们的依赖关系。
* 
*@parameter default value=“${project.pluginarifactrepositories}”
*@readonly
*/
私有列表插件库;
/**
*@parameter default value=“${localRepository}”
*@readonly
* */
私有工件库localRepository;

列出目标=。。。
文件pomFile=。。。
MavenExecutionRequest req=新的DefaultMavenExecutionRequest();
请求setPom(pom文件);
req.setBaseDirectory(pomFile.getParentFile());
要求设定目标(目标);
请求setProxies(session.getSettings().getProxies());
请求setMirrors(session.getSettings().getMirrors());
请求setLocalRepository(localRepository);
请求setRemoteRepositories(remoteArtifactRepositories);
请求setPluginArtifactRepositories(pluginArtifactRepositories);
MavenExecutionResult=会话。执行(req);

要反思处理过程,可以将AbstractExecutionListener子类化,并使用req.setExecutionListener()应用它。

我没有提到的是:


问题是你为什么需要它?为什么不使用Maven的生命周期?@khmarbaise以Maven发布插件为例——它派生了Maven,因为它需要对生命周期进行控制,并且需要对从SCM签出的任意项目进行操作。我的插件也执行发布。不幸的是,我不能使用Maven Release插件,因为它与我们的“AccuRev”SCM软件的交互非常脆弱,而且在其他地方也有一两个bug。Maven Release插件使用Maven Invoker插件在后台运行Maven。此外,为什么不从零开始修复AccuRev的SCM提供商的bug呢?@khmarbaise理想情况下,我会修复OSS项目,但我不是一个经验丰富的OSS提交人,也没有提交项目的权限(而且我已经到了最后期限)。不仅如此,我们的发布流程也非常专业,使我们自己的发布更加容易。但是你可以将一些问题放入跟踪系统(JIRA)。在你开始发送补丁之前,你永远不会得到一个OSS提交人……但是,在系统中提交问题就足够了。此外,在每个项目中,我们总是在截止日期之前;-)我确实玩过这个游戏,但是初始化每个插件运行似乎需要一段时间,因此看起来像是分叉。使用我答案中的代码运行似乎更快。我尝试了这个方法,但找不到一种方法来初始化这些接口中的大多数。与创建maven会话一样,需要一个作为接口的plexus容器。
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);