Maven mojo没有从pom中获取配置

时间:2013-09-19 15:49:09

标签: maven maven-plugin pom.xml

我编写了一个Maven插件,并将其作为另一个项目的包阶段中的目标,并在该项目的pom.xml中给出了配置。但是,使用@parameter表示法设置的字段最终都不会被填充,因此它们只会在使用时抛出NullPointerExceptions。

我的魔力:

/**
 * @goal wrap
 * @phase package
 */
public class MyMojo extends AbstractMojo {

    /**
     * @parameter expression="${project.build.directory}"
     */
    private String outputDirectory;

    /**
     * @parameter
     */
    private String dbDataName;

    private File dbFile;

    public MyMojo(){
        dbFile = new File(outputDirectory, dbDataName) // throws nullpointerexception
    }

    public void execute() throws MojoExecutionException{
        // Do stuff
    }
}

一些mojo pom:

<groupId>com.mycompany.wrapper</groupId>
<artifactId>something-maven-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>maven-plugin</packaging>

...

<build>
<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-plugin-plugin</artifactId>
        <version>3.2</version>
        <configuration>
            <skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound>
        </configuration>
        <executions>
            <execution>
                <id>mojo-descriptor</id>
                <goals>
                    <goal>descriptor</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
</plugins>
</build>

我项目的相关内容:

<plugin>
    <groupId>com.mycompany.wrapper</groupId>
    <artifactId>something-maven-plugin</artifactId>
    <version>1.0-SNAPSHOT</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>wrap</goal>
            </goals>
            <configuration>
                <dbDataName>dcbTestData.sql</dbDataName>
            </configuration>
        </execution>
    </executions>
</plugin>

谁能看到我在这里做错了什么?很可能是我只是没有看到的一些愚蠢的错误。

2 个答案:

答案 0 :(得分:4)

我已经解决了这个问题。我做了一些错事,但在改变和修补之后,我设法解决了。

顺便说一句,由于Maven文档和用户指南在是否更喜欢注释或javadocs样式方面有点不一致,而且在某些地方他们建议使用弃用的方法,例如{{ 1}}形式。

无论如何要让它发挥作用:

  1. 我纠正了khmarbaise在他的第一条评论中指出的错误,我在我的pom中稍微破坏了maven-plugin-plugin定义。
  2. 我更新了基于Java注释的方式来表示Mojos和参数(如果我在没有执行此步骤的情况下完成了第3步,它可能会有效,但更新似乎仍然是个好主意)
  3. 主要问题是我试图访问构造函数中的参数变量以将值赋给其他变量,但mojo在运行execute()方法之前不会获取配置详细信息。所以我只是将使用参数的任何变量赋值移动到execute()方法的开头,然后它们就可以了。
  4. 所以这就是我的mojo现在的样子:

    expression="${stuff}"

答案 1 :(得分:2)

您应该更改以下代码:

/**
 * @parameter default-value="${project.build.directory}"
 */
private String outputDirectory;