【问题标题】:Maven: execution from command line and multiple executions in configMaven:从命令行执行和配置中的多次执行
【发布时间】:2016-04-26 11:19:56
【问题描述】:

我想从命令行执行插件目标,但要执行插件的多次执行。为此,我的 POM 如下所示:

<plugin>
    <groupId>xxx.yyy</groupId>
    <artifactId>zzz</artifactId>
    <version>1.1.6</version>
    <executions>
        <execution>
            <id>default-cli-1</id>
            <goals>
                <goal>mygoal</goal>
            </goals>
            <configuration>
                .... config1 ....
            </configuration>
        </execution>
        <execution>
            <id>default-cli-2</id>
            <goals>
                <goal>mygoal</goal>
            </goals>
            <configuration>
                .... config2 ....
            </configuration>
        </execution>
    </executions>
</plugin>

我想做的是这样的:

mvn xxx.yyy.zzz:mygoal

然后执行两次执行。但我不知道怎么做。

我知道从命令行执行时我不能使用&lt;id&gt;。这就是default-cli 的用途。但是&lt;id&gt;&lt;executions&gt; 中必须是唯一的,这意味着我只能将default-cli 放在一个execution 上。

Maven 版本 3.0.5

【问题讨论】:

    标签: java maven maven-3


    【解决方案1】:

    您可以通过 @executionId 附加选项从 Maven 3.3.1this 新功能开始的命令行执行目标(及其执行)。

    关于 Maven 和执行 ID 的生成,您也可以查看this SO question


    在 Maven 3.3.1 之前,您可以改为将两个执行绑定到通常不会造成伤害的阶段(如 validate),并具有以下内容:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.5</version>
        <executions>
            <execution>
                <id>execution-1</id>
                <phase>validate</phase>
                <goals>
                    <goal>jar</goal>
                </goals>
                <configuration>
                    <classifier>something1</classifier>
                </configuration>
            </execution>
            <execution>
                <id>execution-2</id>
                <phase>validate</phase>
                <goals>
                    <goal>jar</goal>
                </goals>
                <configuration>
                    <classifier>something2</classifier>
                </configuration>
            </execution>
        </executions>
    </plugin>
    

    然后执行:

    mvn validate
    

    作为无害阶段的一部分,您将有效地执行同一插件的同一目标的两次执行。

    如果您不希望默认情况下将它们作为此阶段的一部分(可以理解),那么您可以将它们移动到配置文件中并将其作为执行的一部分激活:

    mvn validate -PpluginGoalExecution
    

    为了完整起见,配置文件如下所示:

    <profile>
        <id>pluginExecution</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-jar-plugin</artifactId>
                    <version>2.5</version>
                    <executions>
                        <execution>
                            <id>execution1</id>
                            <phase>validate</phase>
                            <goals>
                                <goal>jar</goal>
                            </goals>
                            <configuration>
                                <classifier>something1</classifier>
                            </configuration>
                        </execution>
                        <execution>
                            <id>execution2</id>
                            <phase>validate</phase>
                            <goals>
                                <goal>jar</goal>
                            </goals>
                            <configuration>
                                <classifier>something2</classifier>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>
    

    不言而喻:在这种情况下,配置文件的 id 应该非常清楚地说明它将实际执行哪个插件和哪个目标(即配置文件的目的,像往常一样)。

    更新
    只是装饰性的,但您也可以添加到元素上方的配置文件中:

    <defaultGoal>validate</defaultGoal>
    

    这样您只需要运行以下 Maven 命令(仅激活配置文件):

    mvn -PpluginGoalExecution
    

    然后它会自动执行验证阶段和配置的插件执行。没有太大的变化(正如我所说的,装饰性的),但可能更接近于插件目标执行而不是 Maven 阶段调用(再次,只是外观)。

    【讨论】:

    • 谢谢。这是一个很好的答案。不幸的是,我仍在使用 Maven 3.0.5。
    • 如果您使用的是 Maven 3.0.5,这是不可能的...只能通过可通过mvn -PXXX1 ... 激活的配置文件来实现...
    • @peterh 好的,我会相应地更新我的答案,有窍门,对你来说可能值得
    • @peterh 我更新了答案并测试了提案,如果您接受配置文件的妥协和无害阶段的执行,则可以完美运行
    • @A.DiMatteo。谢谢。我不能使用“无害阶段”的想法,因为这意味着当我说mvn package 时也会执行这些步骤。不好。唯一会“无害”的是deploy 之后是否有阶段这样的事情,但没有。我相信个人资料的想法会奏效。我会接受答案 - 不是因为我喜欢它(不是你的错,Maven 的错),而是因为你的回答迅速而有见地。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 2020-03-08
    • 2018-07-13
    • 1970-01-01
    • 2014-02-13
    相关资源
    最近更新 更多