扩展默认Maven原型环境变量

时间:2013-02-07 02:14:52

标签: java maven

我的原型资源文件中需要一个变量,它是生成新项目的目录的路径。 This StackOverflow post来自一个制作自己的插件的人。

不幸的是,我无法弄清楚它最初是如何运行的。如果我运行此命令:

mvn \
com.example.build.maven:property-setter-maven-plugin:0.1:set-properties \
archetype:generate \
-DarchetypeGroupId=... -DarchetypeArtifactId=... -DarchetypeVersion=... -DartifactId=...

从我打算从原型创建新项目的空目录中我得到此错误:

Goal requires a project to execute but there is no POM in this directory

这对我来说似乎完全错了。我正在尝试在这个目录中创建一个新的maven项目,那里应该没有pom.xml。所以,我查了the phases run by maven-archetype-plugin并决定在<goal>archetype:generate</goal>上运行此插件,然后从正在执行的maven命令中删除了set-properties。

现在,当我运行archetype:generate命令时,它会生成一个原型,但是我不需要存在任何环境变量,就好像插件现在什么都不做。

有人知道如何让它发挥作用吗?

1 个答案:

答案 0 :(得分:1)

首先简单回答:

真的需要自定义插件吗? ${basedir}变量应该在原型资源文件中工作,该文件对应于运行原型的基本目录。

目标项目的根目录是$ {basedir} / $ {artifactId},因此如果我的模板pom.xml如下:

<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>${groupId}</groupId>
    <artifactId>${artifactId}</artifactId>
    <version>${version}</version>
    <packaging>jar</packaging>

    <name>A custom project at base ${basedir}/${artifactId}</name>

</project>

然后原型生成的pom.xml看起来像:

<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>galah</groupId>
    <artifactId>galah-artifact</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>A custom project at base /home/prunge/java/testing/galah-artifact</name>

</project>

(假设我通过命令行/提示设置了groupId,artifactId,version)


但现在让我们假设您需要这些环境变量是出于其他原因,而不仅仅是项目的基本目录。

据我所知,property-setter-maven-plugin获取当前执行属性并将它们放在环境变量中。而且你需要基目录

要使property-setter-maven-plugin运行,需要修改,因为原始版本要求项目/ POM按照元数据中的定义运行。

最初的MOJO定义:

/**
 * @goal set-properties
 * @phase validate
 * @since 0.1
 */
public class PropertySetterMojo extends AbstractMojo
{
    /**
     * @parameter default-value="${project}"
     * @parameter required
     * @readonly
     */
    private MavenProject project;

    /**
     *  @parameter expression="${session}"
     *  @readonly
     */
    private MavenSession session;

    /**
     * @parameter expression="${mojoExecution}"
     * @readonly
     * @required
     */
    protected MojoExecution execution;

    ...

}

为了使这个插件可以在没有项目存在的情况下运行,需要进行一些更改:

  • @requiresProject false,因为默认情况下这是真的。其他文档为here
  • project类型的MavenProject字段标记为@parameter required - 需要将其删除,以便MOJO无需项目即可执行。通过随意浏览原始帖子的源代码,此字段未被使用,因此可以安全删除。

所以你最终会得到类似的东西:

/**
 * @goal set-properties
 * @phase validate
 * @since 0.1
 * @requiresProject false 
 */
public class PropertySetterMojo extends AbstractMojo
{
    /**
     *  @parameter expression="${session}"
     *  @readonly
     */
    private MavenSession session;

    /**
     * @parameter expression="${mojoExecution}"
     * @readonly
     * @required
     */
    protected MojoExecution execution;

    ...

}

然后您可以像以前一样运行命令行:

mvn \
com.example.build.maven:property-setter-maven-plugin:0.1:set-properties \
archetype:generate \
-DarchetypeGroupId=... -DarchetypeArtifactId=... -DarchetypeVersion=... -DartifactId=...

和property-setter-maven-plugin应该能够立即执行。