Is it possible to execute two different maven exec-maven-plugin in a single POM

Maven

Maven Problem Overview


I execute the following code using mvn exec:java com.mycompany.FooServer.

I would like to add another server which I can execute like mvn exec:java com.mycompany.BarServer.

How do I do that within a single pom file?

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.2.1</version>
            <executions>
                <execution>
                    <goals>
                        <goal>java</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <mainClass>com.mycompany.FooServer</mainClass>
            </configuration>
        </plugin>
 </build>  

Maven Solutions


Solution 1 - Maven

Try this. You can have more than one execution under executions. All you need to do is move the configuration element under the execution. The plugin has configuration, but each execution can also have a separate configuration element.

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.2.1</version>
            <executions>
                <execution>
                    <id>first-execution</id>
                    <goals>
                        <goal>java</goal>
                    </goals>
                    <configuration>
                        <mainClass>com.mycompany.FooServer</mainClass>
                    </configuration>
                </execution>
                <execution>
                    <id>second-execution</id>
                    <goals>
                        <goal>java</goal>
                    </goals>
                    <configuration>
                        <mainClass>com.mycompany.BarServer</mainClass>
                    </configuration>
                </execution>
            </executions>
        </plugin>
     </plugins>
 </build>

With Maven 3.3.1 and up, you can run an execution by its ID using

mvn exec:java@id

In this case the commands would be mvn exec:java@first-execution and mvn exec:java@second-execution. See this answer for more details.

Solution 2 - Maven

@tieTYT: You can select the execution by id using two distinct profiles:

mvn test -Pmanager

mvn test -Pproxy

<profiles> 
<profile>
	<id>proxy</id>
	<build>
	<plugins>
	<plugin>
		<groupId>org.codehaus.mojo</groupId>
		<artifactId>exec-maven-plugin</artifactId>
		<version>1.2.1</version>
		<executions>
			<execution>
				<phase>test</phase>
				<goals>
					<goal>java</goal>
				</goals>
				<configuration>
					<mainClass>pt.inesc.proxy.Proxy</mainClass>
				</configuration>
			</execution>
		</executions>
	</plugin>
	</plugins>
	</build>
</profile> 
<profile>
	<id>manager</id>
	<build>
	<plugins>
	<plugin>
		<groupId>org.codehaus.mojo</groupId>
		<artifactId>exec-maven-plugin</artifactId>
		<version>1.2.1</version>
		<executions>
			<execution>
				<phase>test</phase>
				<goals>
					<goal>java</goal>
				</goals>
				<configuration>
					<mainClass>pt.inesc.manager.Manager</mainClass>
				</configuration>
			</execution>
		</executions>
	</plugin>
	</plugins>
	</build>
</profile> 
</profiles>

Solution 3 - Maven

With maven > 3.3.1 it is possible to specify the execution id as:

mvn exec:java@execId

Solution 4 - Maven

For me including configuration in the execution block didn't work and maven complained about main class not being set. But inspired by Dario's answer I'd answer this question as follows:

<profiles>
    <profile>
        <id>foo</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>exec-maven-plugin</artifactId>
                    <version>1.3.2</version>
                    <configuration>
                        <mainClass>com.mycompany.FooServer</mainClass>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
    <profile>
        <id>bar</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>exec-maven-plugin</artifactId>
                    <version>1.3.2</version>
                    <configuration>
                        <mainClass>com.mycompany.BarServer</mainClass>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

Which then allows you to run one or the other server using:

mvn exec:java -Pfoo

or

mvn exec:java -Pbar

Cheers,

Solution 5 - Maven

I find the solution: I put <configuration> in <execution>

you can use mvn clean test -Pfoo,bar

<profiles>
	<profile>
		<id>foo</id>
		<build>
			<plugins>
				<plugin>
					<groupId>org.codehaus.mojo</groupId>
					<artifactId>exec-maven-plugin</artifactId>
					<version>1.3.2</version>
					<executions>
						<execution>
							<id>CountContinusIntegr-execution</id>
							<phase>compile</phase>
							<goals>
								<goal>java</goal>
							</goals>
							<configuration>
								<mainClass>com.mycompany.FooServer</mainClass>
							</configuration>
						</execution>
					</executions>
				</plugin>
			</plugins>
		</build>
	</profile>
	<profile>
		<id>bar</id>
		<build>
			<plugins>
				<plugin>
					<groupId>org.codehaus.mojo</groupId>
					<artifactId>exec-maven-plugin</artifactId>
					<version>1.3.2</version>
					<executions>
						<execution>
							<id>CountContinusIntegr-execution</id>
							<phase>compile</phase>
							<goals>
								<goal>java</goal>
							</goals>
							<configuration>
								<mainClass>com.mycompany.BarServer</mainClass>
							</configuration>
						</execution>
					</executions>
				</plugin>
			</plugins>
		</build>
	</profile>
</profiles>

Solution 6 - Maven

I'm afraid that what you want is not possible. I could not find a way to call the same exec-maven-plugin goal directly (mvn exec:java) with different configurations in .pom file.

Said that, you can however have multiple executions of exec-maven-plugin. The thing is you can not call the goals directly. You have to use multiple executions and bind them to particular build phases.

You could also make use of the following solution that fitted me. You can still call one goal directly with it's configuration in the .pom:

<plugin>
	<groupId>org.codehaus.mojo</groupId>
	<artifactId>exec-maven-plugin</artifactId>
	<version>1.3.2</version>
	<executions>
		<execution>
			<id>Acceptance Tests</id>
			<phase>integration-test</phase>
			<goals>
				<goal>exec</goal>
			</goals>
			<configuration>
				<executable>pybot</executable>
				<arguments>
					<!--...-->
				</arguments>
			</configuration>
		</execution>
	</executions>
	<configuration>
		<mainClass>pt.jandias.someapp.persistence.SchemaGenerator</mainClass>
		<arguments>
			<!--...-->
		</arguments>
	</configuration>
</plugin>

One could than use mvn exec:java and mvn integration-test at will.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestiondiyaView Question on Stackoverflow
Solution 1 - MavenTim O'BrienView Answer on Stackoverflow
Solution 2 - Mavendario nascimentoView Answer on Stackoverflow
Solution 3 - MavenGeorgeView Answer on Stackoverflow
Solution 4 - MavenJacekView Answer on Stackoverflow
Solution 5 - MavenStéphane GRILLONView Answer on Stackoverflow
Solution 6 - MavenJosé AndiasView Answer on Stackoverflow