Конфигурация mojo не инициализирована перед выполнением в пользовательском плагине maven

Учитывая, что у меня есть следующий пользовательский моджо...

/**
 * @goal portal-test
 */
public class PortalTestMojo extends AbstractMojo {


    /*
     * @parameter
     * @required
     */
    private String baseUrl;

    public void execute() throws MojoExecutionException {
        getLog().info("" + baseUrl.isEmpty());
    }

}

... когда я запускаю тест mvn на следующем pom...

 25   <build>
 26     <plugins>
 27       <plugin>
 28         <groupId>com.lgi.plugins</groupId>
 29         <artifactId>maven-plugin-facade</artifactId>
 30         <version>1.0-SNAPSHOT</version>
 31         <executions>
 32           <execution>
 33             <id>testing-mojo</id>
 34             <phase>test</phase>
 35             <goals>
 36               <goal>portal-test</goal>
 37             </goals>
 38           </execution>
 39         </executions>
 40         <configuration>
 41             <baseUrl>TEST</baseUrl>
 42           
 45         </configuration>
 46       </plugin>
 47     </plugins>
 48   </build>

... Я получаю исключение нулевого указателя на baseUrl

[ERROR] Failed to execute goal com.lgi.day:maven-plugin-facade:1.0-SNAPSHOT:portal-test (testing-mojo) on project testPom: Execution testing-mojo of goal com.lgi.day:maven-plugin-facade:1.0-SNAPSHOT:portal-test failed. NullPointerException -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal com.lgi.day:maven-plugin-facade:1.0-SNAPSHOT:portal-test (testing-mojo) on project testPom: Execution testing-mojo of goal com.lgi.day:maven-plugin-facade:1.0-SNAPSHOT:portal-test failed.
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:225)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:319)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156)
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:537)
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196)
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:141)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352)
Caused by: org.apache.maven.plugin.PluginExecutionException: Execution testing-mojo of goal com.lgi.day:maven-plugin-facade:1.0-SNAPSHOT:portal-test failed.
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:110)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209)
    ... 19 more
Caused by: java.lang.NullPointerException
    at com.lgi.day.PortalTestMojo.execute(PortalTestMojo.java:52)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101)

Может ли кто-нибудь сказать мне, почему мои параметры конфигурации maven не инициализируются перед выполнением (когда они четко определены в pom) ??????

Приведенный выше файл pom используется в интеграционном тесте для плагина, который проходит. Вот код:

import java.io.File;
import org.apache.maven.plugin.testing.AbstractMojoTestCase;
import com.lgi.day.PortalTestMojo;

public class MojoVaribaleAssignmentTest extends AbstractMojoTestCase {

    private final String TEST = "TEST";

    public void testMojoGoal() throws Exception {
        File testPom = new File(getBasedir(), "src/test/resources/testPom.xml");

        PortalTestMojo mojo = (PortalTestMojo) lookupMojo("portal-test",
                testPom);

        assertEquals(TEST, mojo.getBaseUrl());
        assertEquals(TEST, mojo.getPortalPath());
        assertEquals(TEST, mojo.getUserName());
        assertEquals(TEST, mojo.getPassword());
    }

}

Вот файл pom для самого плагина:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.lgi.day</groupId>
  <artifactId>maven-plugin-facade</artifactId>
  <packaging>maven-plugin</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>maven-plugin-facade Maven Mojo</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>org.apache.maven</groupId>
      <artifactId>maven-plugin-api</artifactId>
      <version>2.0</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>com.lgi.day</groupId>
        <artifactId>groovy-portal-tests-core</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>org.apache.maven.shared</groupId>
        <artifactId>maven-plugin-testing-harness</artifactId>
        <version>1.0-beta-1</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.maven.plugin-tools</groupId>
        <artifactId>maven-plugin-tools</artifactId>
        <version>RELEASE</version>
    </dependency>
  </dependencies>
</project>

Я использую maven версии 3.0.3.


person murungu    schedule 26.11.2012    source источник
comment
Просто чтобы очистить, добавьте значение по умолчанию для вашего параметра и перепроверьте. Чтобы убедиться, что это не просто опечатка и т. д. Кроме того, было бы полезно, если бы вы могли опубликовать свой pom.xml (какую версию Maven вы используете?) Есть ли у вас какие-либо интеграционные тесты? Или вы вручную установили плагин для тестирования в свой локальный репозиторий?   -  person khmarbaise    schedule 26.11.2012
comment
(Извините, в разделе комментариев недостаточно места, пожалуйста, посмотрите сам раздел вопросов, где я добавил запрошенные вами ресурсы)   -  person murungu    schedule 27.11.2012


Ответы (1)


Задача решена!!!

Я набрал mvn help: Effective pom и заметил, что версия maven-plugin-plugin 2.7.

Затем я посмотрел на сгенерированный дескриптор плагина @target/classes/META-INF/maven/plugin.xml и заметил, что элемент параметров был пуст ()

Другими словами, цель дескриптора maven-plugin-plugin для версии 2.7 не интерпретирует старые устаревшие аннотации, которые появляются в комментариях.

Я обновил свой pom, чтобы использовать более новую версию maven-plugin-plugin, и добавил аннотации maven-plugin-в качестве зависимости. Необходимые изменения описаны здесь:

http://maven.apache.org/plugin-tools/maven-plugin-plugin/examples/using-annotations.html

Затем я прокомментировал моджо...

@Mojo(name = "portal-test")
public class PortalTestMojo extends AbstractMojo {

    @Parameter(required = true)
    private String baseUrl;

...так далее

Затем элемент параметров был заполнен в дескрипторе плагина.

person murungu    schedule 27.11.2012