Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Maven: execution from command line and multiple executions in config

I would like to execute a plugin goal from command line but perform multiple executions of the plugin. To this end my POM looks like this:

<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>

What I would like to do is something like:

mvn xxx.yyy.zzz:mygoal

and that would then execute the two executions. But I cannot figure out how.

I'm aware that I cannot use an <id> when executing from the command line. That is what the default-cli is for. However the <id> must be unique within <executions> which means I can only put the default-cli on one execution.

Maven version 3.0.5.

like image 342
peterh Avatar asked Jan 20 '16 14:01

peterh


People also ask

What is Maven plugin execution configuration?

In this tutorial, we cover the Maven Plugin execution configuration. The element <executions>/<execution> allows you to configure the execution of a plugin goal. With it, you can accomplish the following things. bind a plugin goal to a lifecycle phase.

How to execute Maven project from command prompt?

Now Executing Maven Project from Command Prompt. Maven Surefire Pluginmust be added. 1. mvn clean install : It will execute all test cases as well as it will generate a build. Build will be generated under target folder. 2. mvn clean test : It will execute only test cases and it won’t generate build.

What is generic configuration in Maven?

Generic Configuration. Maven plugins (build and reporting) are configured by specifying a <configuration> element where the child elements of the <configuration> element are mapped to fields, or setters, inside your Mojo (remember that a plug-in consists of one or more Mojos where a Mojo maps to a goal).

How to echo a message from a plugin in Maven?

Let’s demonstrate plugin execution with an example. In Apache Ant, it’s quite easy to output echo any property or message during the build and many of us frequently use it to understand the build flow or to debug. But, Maven comes with no such feature, and only way to echo any message is to use Ant within Maven.


1 Answers

You can execute a goal (and its execution) from command line starting from Maven 3.3.1 on and this new feature, via the @executionId additional option.

Concerning Maven and execution ids generation, you can also check this SO question.


Before Maven 3.3.1 you could instead bind the two executions to a phase which would normally not harm (like validate) and have something like the following:

<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>

Then executing:

mvn validate

You will effectively execute the two executions of the same goal of the same plugin, as part of an harmless phase.

If you don't want to have them as part of this phase by default (understandable), then you can move them to a profile and activate it as part of the execution:

mvn validate -PpluginGoalExecution

For completeness, the profile would look like:

<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>

And it goes without saying: the id of the profile should in this case be quite self explanatory about which plugin and which goal it would actually execute (that is, the purpose of the profile, as usual).

Update
Just cosmetic, but you could also add to the profiled build above the element:

<defaultGoal>validate</defaultGoal>

So that you would only need to run the following Maven command (only profile activation):

mvn -PpluginGoalExecution

And it would then automatically execute the validate phase and the configured plugin executions. Not a big change (as I said, cosmetic), but maybe closer to a plugin goal execution rather than a Maven phase invocation (again, just appearance).

like image 93
A_Di-Matteo Avatar answered Oct 17 '22 00:10

A_Di-Matteo