2

我编写了一个 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
    }
}

一些魔力 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>

我的项目 pom 的相关位:

<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>

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

4

2 回答 2

5

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

顺便说一句,这个过程变得相当困难,因为 Maven 文档和用户指南对于他们更喜欢注释还是 javadocs 样式有点不一致,并且在某些地方他们推荐了不推荐使用的方法,例如expression="${stuff}"表单。

无论如何让它工作:

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

所以这就是我的魔力现在的样子:

@Mojo(name = "wrap", defaultPhase = LifecyclePhase.PACKAGE)
public class MyMojo extends AbstractMojo {

    @Parameter(property="project.build.directory")
    private File outputDirectory;

    @Parameter(property="dbDataName")
    private String dbDataName;

    private File dbFile;

    public void execute()
        throws MojoExecutionException {
        dbFile = new File(outputDirectory, dbDataName);

        // Do other stuff
    }
}
于 2013-09-20T13:45:19.507 回答
2

您应该如下更改您的代码:

/**
 * @parameter default-value="${project.build.directory}"
 */
private String outputDirectory;
于 2013-09-20T09:55:15.503 回答