0

我的原型资源文件中需要一个变量,它是生成新项目的目录的路径。这篇 StackOverflow 帖子来自一个制作了自己的插件来执行此操作的人。

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

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。所以,我查看了maven-archetype-plugin 运行的阶段,并决定改为运行这个插件,<goal>archetype:generate</goal>并从我正在执行的 maven 命令中删除了 set-properties。

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

有人知道我怎样才能让它工作吗?

4

1 回答 1

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因为默认情况下这是真的。附加文档在这里
  • 有一个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 现在应该可以执行了。

于 2013-02-07T03:16:35.013 回答