【问题标题】:Making a Maven archetype: how to run a mojo on a project's generation?制作 Maven 原型:如何在项目的一代上运行 mojo?
【发布时间】:2016-12-17 21:18:01
【问题描述】:

我正在创建一个 Maven 原型,并且正在查看其他原型的来源。

我能够找出how files and folders are createdhow substitution occurs within files of an archetype

现在我想编写一些代码,在新项目的原型运行时运行,以操作复制的文件并做一些其他的事情。

我该怎么做? guide to making archetypes 似乎已过时,从未提及。

【问题讨论】:

    标签: maven maven-archetype


    【解决方案1】:

    我使用原型 maven 插件的属性 -Dgoal。在此属性中,您可以指定其他目标以立即在从原型创建的项目上运行。

    所以,我在我的 maven 原型项目中创建了一个新的 maven 插件模块,这个模块包含我想要执行的所有其他 java 逻辑。我不需要在生成的项目的新创建的 pom.xml 中指定这个插件。

    更多细节:这里是 maven-plugin 的 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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>yourGroupId</groupId>
    <artifactId>init-maven-plugin</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>maven-plugin</packaging>   
    
    <dependencies>       
        <dependency>
            <groupId>org.apache.maven</groupId>
            <artifactId>maven-plugin-api</artifactId>
            <version>3.0.4</version>
        </dependency>
        <dependency>
            <groupId>org.apache.maven</groupId>
            <artifactId>maven-project</artifactId>
            <version>3.0-alpha-2</version>
        </dependency>
    </dependencies>
    

    这是魔精:

    /**
     * @goal maven-plugin-init
     */
    public class InitMojo extends AbstractMojo
    {    
        /**
         * @parameter expression="${project.basedir}"
         */
        private File basedir;
        public void execute() throws MojoExecutionException, MojoFailureException
        {
           //write initialization logic here
        }
    }
    

    因此,“basedir”中将是新创建项目的 basedir。

    唯一的问题是如何将原型的输入参数传递给我们的初始化插件。我只是在新创建的项目的根目录中使用原型创建一个文件“initial.properties”,并将所有输入参数存储在那里。然后在初始化插件中读取这个文件。

    要启动您的原型,请使用以下命令:mvn archetype:generate $archetype_properties -Dgoals=yourGroupId:init-maven-plugin:maven-plugin-init

    【讨论】:

      【解决方案2】:

      V。 Artyukhov 是对的,但是你想做的事情(修改文件等)可以很容易地通过使用 -Dgoals:antrun:run 和下面的 pom 来完成。您不需要自己的插件。 Ant 在这里很有意义,因为您可以将许多文件操作放在一个语句中。注意 id default-cli,它在使用命令行时执行(就像 -Dgoals 一样)。

      <plugin>
          <artifactId>maven-antrun-plugin</artifactId>
          <executions>
              <execution>
                  <id>default-cli</id>
                  <configuration>
                      <target>
                          <ant antfile="src/ant/custom.xml" inheritRefs="true">
                              <property name="customGroupId" value="${customGroupId}"/>
                              <property name="customArtifactId" value="${customArtifactId}"/>
                              <property name="customVersion" value="${customVersion}"/>
                          </ant>
                      </target>
                  </configuration>
                  <goals>
                      <goal>run</goal>
                  </goals>
              </execution>
          </executions>
      </plugin>
      

      【讨论】:

      • Jan:我尝试了你的建议,当我构建原型时插件正在运行,而不是在我运行原型时运行:生成。一个快速的演示是使用 maven-antrun-plugin 并回显一些消息。我认为不可能将任何可运行代码插入到将在 archetype:generate 运行的原型项目中。 V. Artyukhov 的解决方案似乎是唯一的方法。
      • @Thirlan:唉,你是对的——我想到了这种情况,但它只是在存储库中安装原型之前操作一些东西。我据此更新了我的答案。
      猜你喜欢
      • 1970-01-01
      • 2013-05-07
      • 2011-03-15
      • 1970-01-01
      • 2013-12-02
      • 2014-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多