【问题标题】:Maven mojo not picking up configuration from pomMaven mojo 没有从 pom 中获取配置
【发布时间】:2013-09-19 15:49:09
【问题描述】:

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

我的项目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>

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

【问题讨论】:

  • 首先我从未听说过名为build 的构建生命周期阶段?除此之外,maven-plugin-plugin 的配置看起来真的很错误..你在 github 上的某个地方有这个项目吗?
  • 啊,感谢您指出这一点 - 我错误地编辑了 maven-plugin-plugin 部分的一部分,然后进一步试图纠正它!我现在已经纠正了这个问题,但我仍然遇到同样的问题,即我的 mojo 中没有初始化字段。帖子已更新。
  • 您还没有将 dbFile 定义为参数,因此它不会被 Maven 初始化,也不会被您在配置中提供的参数初始化,也不能因为它没有被定义为参数。
  • 谢谢。实际上,在为 stackoverflow 帖子调整我的代码时这是一个错误,它的意思是阅读dbFile = new File(outputDirectory, dbDataName),所以 dbFile 并不是一个参数。我已经在我的帖子中更正了。

标签: maven maven-plugin pom.xml


【解决方案1】:

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

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

无论如何让它工作:

  1. 我更正了 khmarbaise 在他的第一条评论中指出的错误,我在我的 pom 中稍微修改了 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
    }
}

【讨论】:

  • 另一个没有真正关注但非常重要的部分是你使用File而不是String(这里是正确的)。如果您尝试使用 String 并尝试接收例如${project.basedir} 那么您将收到 null。然后你会因为foo-${project.basedir} 工作而发疯(因为连接会将其转换为String
【解决方案2】:

你应该像下面这样改变你的代码:

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

【讨论】:

  • 谢谢,我已经让那个工作了,但它仍然没有从 pom 中获取配置参数(即dbDataName 参数)。有什么想法吗?
  • 项目在线?喜欢 Github,所以我可以看看它?
  • 谢谢,但我终于设法解决了这个问题。我写了一个答案,详细说明了我做错了什么。感谢您的帮助!
  • 这将失败,因为您将其解析为 String 而不是 File
猜你喜欢
  • 2012-05-23
  • 1970-01-01
  • 2021-05-11
  • 1970-01-01
  • 2014-03-05
  • 2016-06-27
  • 1970-01-01
  • 2011-05-26
  • 2014-07-22
相关资源
最近更新 更多