Maven: получить конфигурацию цели из исполнительного элемента

Давайте представим, что у меня есть следующее моджо:

@Mojo(name = "some-goal")
public class MyMojo {
    @Parameter(required = true)
    protected ComplexObject param;
    /*...*/
}

Также у меня есть дескриптор плагина в pom:

<plugin>
  <!-- here artifact description -->
  <executions>
     <execution>
       <phase>...</phase>
       <goals><goal>some-goal</goal></goals>
       <configuration>
         <param>...</param>
       </configuration>
     </execution>
  </executions>
</plugin>

Для тестирования этого плагина я использую maven-plugin-testing-harness.

И мой тестовый код:

@Test
public void test() throws Exception {
    File pom = getFile("mix/pom.xml");

    MyMojo plugin = (MyMojo) rule.lookupMojo("some-goal", pom);
    /*....*/

}

Где правило:

@Rule
public MojoRule rule = new MojoRule() {
    @Override
    protected void before() throws Throwable {
    }

    @Override
    protected void after() {
    }
};

Но когда я запускаю тест, он терпит неудачу с исключением:

org.apache.maven.plugin.testing.ConfigurationException: не удается найти элемент конфигурации для подключаемого модуля с идентификатором артефакта {plugin-name}.

at org.apache.maven.plugin.testing.AbstractMojoTestCase.extractPluginConfiguration(AbstractMojoTestCase.java:619)
at org.apache.maven.plugin.testing.AbstractMojoTestCase.extractPluginConfiguration(AbstractMojoTestCase.java:582)
at org.apache.maven.plugin.testing.AbstractMojoTestCase.lookupMojo(AbstractMojoTestCase.java:353)
at org.apache.maven.plugin.testing.MojoRule.lookupMojo(MojoRule.java:164)

Когда я отлаживаю источник maven-plugin-testing-harness, я заметил, что он считывает конфигурацию только из корневого элемента плагина.

Как я могу заставить его читать конфигурацию из исполнительного элемента?


person Artsiom Kotau    schedule 07.07.2016    source источник
comment
Вы решили ситуацию?   -  person Adam    schedule 06.07.2017
comment
К сожалению нет. Я сделал обходной путь.   -  person Artsiom Kotau    schedule 09.07.2017
comment
Да, сочувствую. Я посмотрел исходный код. Это очень просто, жестко закодировано, не настраивается. Но достаточно легко изменить для своих целей, если вы решили разветвить исходный код.   -  person Adam    schedule 09.07.2017
comment
Добавьте пустой блок конфигурации на верхний уровень конфигурации вашего плагина.   -  person david.tanner    schedule 28.12.2017


Ответы (3)


Мне помогло добавление пустого блока <configuration></configuration> в тестовую конфигурацию плагина.

Попробуйте использовать эти deps:

<dependency>
    <groupId>org.apache.maven.plugin-testing</groupId>
    <artifactId>maven-plugin-testing-harness</artifactId>
    <version>3.3.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.codehaus.plexus</groupId>
    <artifactId>plexus-component-annotations</artifactId>
    <version>1.7.1</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.apache.maven</groupId>
    <artifactId>maven-compat</artifactId>
    <version>3.3.9</version>
</dependency>

Тестирование плагинов Maven плохо описано и выглядит глючным...

person tjuchniewicz    schedule 09.09.2016
comment
Простое добавление зависимостей без выяснения, нужны ли они вам, может бросить вас в ад зависимостей. Пусть покупатель будет бдителен. Кроме того, в OP уже включен тег конфигурации. - person Adam; 06.07.2017
comment
У OP есть тег конфигурации, но он встроен в выполнение. Для решения проблемы достаточно добавить конфигурацию верхнего уровня. Зависимости являются дополнительными для устранения других проблем. Прежде чем добраться до этой ошибки, я уже добавил maven-compat и maven-plugin-testing-harness. - person david.tanner; 28.12.2017

Есть два способа решить эту проблему.

Измените вызов lookupMojo("some-goal", pom) на lookupEmptyMojo("some-goal", pom)

Или внутри build -> plugins -> plugin добавьте пустой раздел <configuration></configuration>.

<plugin>
  <!-- here artifact description -->
  <configuration></configuration>
  <executions>
     <execution>
       <phase>...</phase>
       <goals><goal>some-goal</goal></goals>
       <configuration>
         <param>...</param>
       </configuration>
     </execution>
  </executions>
</plugin>
person david.tanner    schedule 27.12.2017

Как вы указали часть

<!-- here artifact description -->

Вы указали идентификатор группы и идентификатор артефакта вашего плагина? Если это не так, часть конфигурации не используется. Это может быть связано с тем, что архетип генерируется не совсем правильно (https://issues.apache.org/jira/projects/MARCHETYPES/issues/MARCHETYPES-67?filter=allopenissues)

person lorenzo-bettini    schedule 06.01.2020