java maven exec-maven-plugin not executing on mvn clean install

bobanahalf picture bobanahalf · May 15, 2014 · Viewed 8.5k times · Source

Follow-up to a previous question: Maven run class before test phase: exec-maven-plugin exec:java not executing class.

I am running jUnit4 tests, built with maven, on a jenkins box. I need to run a specific main-method java program before before the test phase of my build. The intent is to restore a test database before the tests run.

If I run the exact phase this exec is assigned to, my class executes as expected; but when I run the whole build, my class does not execute:

Specifically, it runs with:
mvn -X exec:java generate-test-resources

But does not run with:
mvn -X -e install
-- or --
mvn -X -e clean install

pom.xml: My pom.xml file includes:

<pluginManagement>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>
        <plugin>            
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.3</version>
            <executions>
                <execution>
                    <id>build-test-environment</id>
                    <phase>generate-test-resources</phase>          
                    <goals>
                        <goal>java</goal>           
                    </goals>
                </execution>
            </executions>
            <configuration>
                <mainClass>main.java._tools.BuildTestEnvironment</mainClass>
            </configuration>
        </plugin>
    </plugins>
</pluginManagement>

Lifecycle default: I have not futzed with maven's lifecycle. The log reports it as:

[DEBUG] Lifecycle default -> [
    validate,
    initialize,
    generate-sources,
    process-sources,
    generate-resources,
    process-resources,
    compile,
    process-classes,
    generate-test-sources,
    process-test-sources,
    generate-test-resources,
    process-test-resources,
    test-compile,
    process-test-classes,
    test,
    prepare-package,
    package,
    pre-integration-test,
    integration-test,
    post-integration-test,
    verify,
    install,
    deploy
]

Answer

Ashish picture Ashish · May 15, 2014

With your plugin defined under the <pluginManagement>, you are actually telling maven which version of the plugin you will use throughout your project when you will invoke the plugin. I would normally expect the <pluginManagement> tag to be present in the parent pom.

To invoke the plugin - simply put the <plugins/> element. It may or may not be inherited from a

Hence to use the plugin, you just need to invoke the plugin by putting

<plugins>
        <plugin>            
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.3</version>
            <executions>
                <execution>
                    <id>build-test-environment</id>
                    <phase>generate-test-resources</phase>          
                    <goals>
                        <goal>java</goal>           
                    </goals>
                </execution>
            </executions>
            <configuration>
                <mainClass>main.java._tools.BuildTestEnvironment</mainClass>
            </configuration>
        </plugin>
    ...AnyOtherPlugin
    <plugins>

without any <pluginManagement> tag