Как программно вызвать плагин зависимостей maven - PullRequest
8 голосов
/ 22 ноября 2010

Я пытаюсь вызвать maven-dependency-plugin программно.Я использую Maven 3 версии.проблема в том, что когда я вызываю его через pluginManager.executeMojo (сеанс, выполнение), я получаю следующее сообщение об ошибке:

[ERROR] **The parameters 'project', 'local', 'remoteRepos',
'reactorProjects' for goal
org.apache.maven.plugins:maven-dependency-plugin:2.1:unpack are
missing or invalid**
**org.apache.maven.plugin.PluginParameterException: The parameters 'project',
'local', 'remoteRepos', 'reactorProjects' for goal
org.apache.maven.plugins:maven-dependency-plugin:2.1:unpack are missing or
invalid**
        at org.apache.maven.plugin.internal.DefaultMavenPluginManager
        .populatePluginFields(DefaultMavenPluginManager.java:518)
        at org.apache.maven.plugin.internal.DefaultMavenPluginManager
        .getConfiguredMojo(DefaultMavenPluginManager.java:471)
        at org.apache.maven.plugin.DefaultBuildPluginManager
        .executeMojo(DefaultBuildPluginManager.java:99)
        at com.sap.ldi.qi.osgi.OSGiManifesrMfHandlerMojo
        .invokeMavenDependencyPlugin(OSGiManifesrMfHandlerMojo.java:139)
        at com.sap.ldi.qi.osgi.OSGiManifesrMfHandlerMojo
        .execute(OSGiManifesrMfHandlerMojo.java:100)
        at org.apache.maven.plugin.DefaultBuildPluginManager
        .executeMojo(DefaultBuildPluginManager.java:110)
        at org.apache.maven.lifecycle.internal.MojoExecutor
        .execute(MojoExecutor.java:144)
        at org.apache.maven.lifecycle.internal.MojoExecutor
        .execute(MojoExecutor.java:87)
        at org.apache.maven.lifecycle.internal.MojoExecutor
        .execute(MojoExecutor.java:79)
-- many lines stripped from stack trace --
[INFO] ----------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ----------------------------------------------------------------------
[INFO] Total time: 17.938s
[INFO] Finished at: Mon Nov 22 10:27:42 EET 2010
[INFO] Final Memory: 12M/23M
[INFO] ----------------------------------------------------------------------
[ERROR] Failed to execute goal
com.sap.ldi.qi:osgi-manifest-handler-plugin:0.0.1-SNAPSHOT:handle
(osgi-manifest-handler plugin) on project com.sap.ldi.demo.calc
.cmd.tests: The parameters 'project', 'local', 'remoteRepos',
'reactorProjects' for goal
org.apache.maven.plugins:maven-dependency-plugin:2.1:unpack are missing
or invalid -> [Help 1]
-- stripped rest --

Как я знаю, единственный обязательный параметр для цели распаковки плагина зависимостей mavenэто артефакт элементы.Я установил конфигурацию плагина с помощью метода PluginExecution.setConfiguration ().Кажется, что эта конфигурация плагина установлена ​​неправильно.У вас есть идея, почему выбрасывается это исключение?

Вот конфигурация, которую я использую:

<configuration>
  <artifactItems>
    <artifactItem>
      <groupId>com.sap.ldi.demo.calc</groupId>
      <artifactId>com.sap.ldi.demo.calc.cmd</artifactId>
      <version>0.1.2-SNAPSHOT</version>
      <type>jar</type>
      <overWrite>true</overWrite>
      <outputDirectory>target/demo-calc-stuff</outputDirectory>
      <includes>**/*.*</includes>
    </artifactItem>
  </artifactItems>
</configuration>

Спасибо


Одна поправка с моей стороны,Используемая версия Maven - это не Maven 3.0, а Maven 3.0-beta-1.Я вижу, что BuildPluginManager.loadPlugin() в версии 3.0-бета-1 имеет два аргумента, и тот же метод в версии 3.0 имеет три.Мне интересно, кто-нибудь пробовал вызывать плагин maven программно с помощью maven 3.0 или maven 3.0-beta-1.Я все еще пытаюсь вызвать его с помощью maven 3.0-beta-1, но он по-прежнему возвращает то же исключение, что и вставленное выше.

Ответы [ 3 ]

12 голосов
/ 23 апреля 2011

Вот обновленная версия Mojo Executor, разработанная для Maven 3:

<code>package com.googlecode.boostmavenproject;

import java.util.Collections;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Plugin;
import org.apache.maven.plugin.MojoExecution;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.descriptor.PluginDescriptor;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.util.xml.Xpp3Dom;
import org.apache.maven.plugin.BuildPluginManager;
import org.apache.maven.plugin.descriptor.MojoDescriptor;
import org.codehaus.plexus.configuration.PlexusConfiguration;
import org.codehaus.plexus.util.xml.Xpp3DomUtils;
import org.sonatype.aether.repository.RemoteRepository;

/**
 * Executes an arbitrary mojo using a fluent interface.  This is meant to be executed within the context of a Maven 2
 * mojo.
 *
 * Here is an execution that invokes the dependency plugin:
 * <pre>
 * executeMojo(
 *              plugin(
 *                      groupId("org.apache.maven.plugins"),
 *                      artifactId("maven-dependency-plugin"),
 *                      version("2.0")
 *              ),
 *              goal("copy-dependencies"),
 *              configuration(
 *                      element(name("outputDirectory"), "${project.build.directory}/foo")
 *              ),
 *              executionEnvironment(
 *                      project,
 *                      session,
 *                      pluginManager
 *              )
 *          );
 * 
* @see http://code.google.com/p/mojo-executor/ * / открытый класс MojoExecutor { / ** * Точка входа для выполнения моджо * * @param plugin Плагин для выполнения * @param цель Цель выполнить * @param configuration Конфигурация исполнения * @param env Среда исполнения * @throws MojoExecutionException Если есть какие-либо исключения, выполняющие или выполняющие mojo * / public static void executeMojo (плагин плагина, строковая цель, конфигурация Xpp3Dom, ExecutionEnvironment env) создает исключение MojoExecutionException { если (конфигурация == ноль) бросить новое NullPointerException («конфигурация не может быть нулевой»); пытаться { MavenSession session = env.getMavenSession (); PluginDescriptor pluginDescriptor = env.getPluginManager (). LoadPlugin (плагин, Коллекции. emptyList (), session.getRepositorySession ()); MojoDescriptor mojo = pluginDescriptor.getMojo (цель); если (mojo == ноль) { выдать новое исключение MojoExecutionException («Не удалось найти цель» + «цель +» в плагине » + plugin.getGroupId () + ":" + plugin.getArtifactId () + ":" + plugin.getVersion ()); } configuration = Xpp3DomUtils.mergeXpp3Dom (конфигурация, toXpp3Dom (mojo.getMojoConfiguration ())); MojoExecution exec = new MojoExecution (mojo, конфигурация); env.getPluginManager (). executeMojo (сеанс, exec); } поймать (исключение е) { выбросить новое исключение MojoExecutionException («Невозможно выполнить mojo», e); } } / ** * Преобразует PlexusConfiguration в Xpp3Dom. * * @param config the PlexusConfiguration * @ возврат Xpp3Dom представления конфигурации Plexus * / частный статический Xpp3Dom toXpp3Dom (конфигурация PlexusConfiguration) { Xpp3Dom result = new Xpp3Dom (config.getName ()); result.setValue (config.getValue (нуль)); for (имя строки: config.getAttributeNames ()) result.setAttribute (name, config.getAttribute (name)); для (PlexusConfiguration дочерний: config.getChildren ()) result.addChild (toXpp3Dom (ребенок)); вернуть результат; } / ** * Свободно создает экземпляр {@link ExecutionEnvironment} * @param mavenProject Текущий проект Maven * @param mavenSession Текущий сеанс Maven * @param pluginManager Менеджер плагинов Build * @return Среда исполнения * @throws NullPointerException, если mavenProject, mavenSession или pluginManager * являются нулевыми * / публичная статическая ExecutionEnvironment executeEnvironment (MavenProject mavenProject, MavenSession mavenSession, BuildPluginManager pluginManager) { вернуть новое ExecutionEnvironment (mavenProject, mavenSession, pluginManager); } / ** * Создает конфигурацию для цели, используя Элементы * @param elements Список элементов для раздела конфигурации * @return Элементы, преобразованные в Maven-родной формат XML * / общедоступная статическая конфигурация Xpp3Dom (Element ... elements) { Xpp3Dom dom = новый Xpp3Dom («конфигурация»); для (Элемент е: элементы) dom.addChild (e.toDom ()); вернуть дом; } / ** * Определяет плагин без его версии* @param groupId Идентификатор группы * @param artifactId Идентификатор артефакта * @return Экземпляр плагина * / public static Plugin plugin (String groupId, String artifactId) {return plugin (groupId, artifactId, null);} / ** * Определяет плагин * @param groupId Идентификатор группы * @param artifactId Идентификатор артефакта * @param version Версия плагина * @return Экземпляр плагина * / public static Plugin plugin (String groupId, String artifactId, String version) {Плагин плагин = новый плагин ();plugin.setArtifactId (артефакт);plugin.setGroupId (идентификатор_группы);plugin.setVersion (вариант);возвратный плагин;} / ** * Перенос строки идентификатора группы в более читаемый формат * @param groupId Значение * @return Значение * / public static String groupId (String groupId) {return groupId;} / ** * Перенос строки идентификатора артефакта в более читаемый формат * @param artifactId Значение * @return Значение * / public static String artifactId (String artifactId) {return artifactId;} / ** * Перенос строки версии в более читаемый формат * @param version Значение * @return Значение * / public static String version (String version) {return version;} / ** * Переносит строку цели в более читаемый формат * @param goal Значение * @return Значение * / public static String goal (String goal) {return goal;} / ** * Перенос строки имени элемента в более читаемый формат * @param name Значение * @return Значение * / public static String name (String name) {return name;} / ** * Создает элемент с текстовым телом * @param name Имя элемента * @param value Текстовое значение элемента * @return Объект элемента * / public static Element element (String name, String value) {return new Element(имя, значение);} / ** * Создает элемент, связывающий дочерние элементы * @param name Имя элемента * @param elements Дочерние элементы * @return Объект Element * / public static Element element (String name, Element ... elements) {return newЭлемент (имя, элементы);} / ** * Класс обертки элемента для элементов конфигурации * / public static class Element {private final Element [] children;личное окончательное строковое имя;приватный финальный текст String;public Element (String name, Element ... children) {this (name, null, children);} public Element (String name, String text, Element ... children) {this.name = name;this.text = text;this.children = дети;} public Xpp3Dom toDom () {Xpp3Dom dom = новый Xpp3Dom (name);if (text! = null) {dom.setValue (text);} for (Элемент e: children) {dom.addChild (e.toDom ());} вернуть дом;}} / ** * Собирает информацию о выполнении Maven * / открытый статический класс ExecutionEnvironment {private final MavenProject mavenProject;закрытый финал MavenSession mavenSession;закрытый финал BuildPluginManager pluginManager;public ExecutionEnvironment (MavenProject mavenProject, MavenSession mavenSession, BuildPluginManager pluginManager) {if (mavenProject == null) генерировать новое исключение NullPointerException ("mavenProject не может быть нулевым");if (mavenSession == null) генерирует новое исключение NullPointerException ("mavenSession не может быть нулевым");if (pluginManager == null)бросить новое NullPointerException («pluginManager не может быть нулевым»);this.mavenProject = mavenProject;this.mavenSession = mavenSession;this.pluginManager = pluginManager;} public MavenProject getMavenProject () {return mavenProject;} public MavenSession getMavenSession () {return mavenSession;} public BuildPluginManager getPluginManager () {return pluginManager;}}}

Я попытаюсь внести свои изменения обратно в официальный плагин Mojo Executor.

2 голосов
/ 23 ноября 2010

Люди, я думаю, я понял.Проблема не в версии Maven, которую я использую.Именно в конфигурации, которую я использую для вызова maven-dependency-plugin.Для цели распаковки maven-dependency-plugin требуются следующие параметры: artifactItems , local , project , реакторПроекты и remoteRepos.Вот правильная версия конфигурации, используемой для вызова плагина:

<configuration>
    <artifactItems>
    <artifactItem>
      <groupId>com.sap.ldi.demo.calc</groupId>
      <artifactId>com.sap.ldi.demo.calc.cmd</artifactId>
      <version>0.1.3-SNAPSHOT</version>
      <type>jar</type>
      <overWrite>true</overWrite>
      <outputDirectory>target/demo-calc-stuff</outputDirectory>
      <includes>**/*.*</includes>
    </artifactItem>
  </artifactItems>
  <local>${localRepository}</local>
  <project>${project}</project>
  <reactorProjects>${reactorProjects}</reactorProjects>
  <remoteRepos>${project.remoteArtifactRepositories}</remoteRepos>
</configuration>`
0 голосов
/ 22 ноября 2010

Плагины Maven не предназначены для программного запуска.

Они основаны на значениях, которые вводятся базовым контейнером сплетения.

Так что либо вам придется узнать, как внедрить этизначения или вам придется полагаться на механизм по умолчанию.

Одна вещь, которую вы можете использовать, это Maven Invoker .При этом вы можете программно запускать жизненные циклы maven, но они будут выполняться в отдельной виртуальной машине.Поэтому, если вам нужно заранее динамически изменить модель, вам нужно будет сериализовать модель во временный файл pom.xml и использовать его вместе с maven invoker.Это тяжелые вещи, но я сделал это успешно около двух лет назад.

...