Using a Pre-Build Script

Complementary to the post-build hook script, you can also create a pre-build hook script that will be run before the invocation of Maven. This can be used to do some preparations for the build.

Default name of Pre-Build script is prebuild, you can use name prebuild.bsh or prebuild.groovy according to chosen script language.

In Pre-Build scripts you can prepare a test resources for your project.

You can also define a user properties which will be added to executed test project by -D Maven argument.

Here is an example of groovy script:

def userProperties = context.get('userProperties')

def server = new MockServer()
userProperties.put('serverHost', server.getHost())
userProperties.put('serverPort', server.getPort())

Now you can use it in test project:

<project>
  <build>
    <plugins>
      <plugin>
        <groupId>org.example</groupId>
        <artifactId>my-maven-plugin</artifactId>
        <version>@project.version@</version>
        <configuration>
          <server>${serverHost}:${serverPort}</server>
        </configuration>
        <executions>
        ....
       </executions>
      </plugin>
    </plugins>
  </build>
</project>

Using a Post-Build Script

Here is an example of how the Invoker Plugin can be used to run a set of Maven projects and then verify their output with a BeanShell or Groovy script. The name of the script file in this case is verify - default value is postbuild.

<project>
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-invoker-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <debug>true</debug>
          <projectsDirectory>src/it</projectsDirectory>
          <preBuildHookScript>setup</preBuildHookScript>
          <postBuildHookScript>verify</postBuildHookScript>
        </configuration>
        <executions>
          <execution>
            <id>integration-test</id>
            <goals>
              <goal>run</goal>
            </goals>
          </execution>
       </executions>
      </plugin>
    </plugins>
  </build>
</project>

Below is an example post-build BeanShell script (verify.bsh) that checks for the existence of a JAR file after the build has run. If the JAR file does not exist, the script throws an exception which causes the Invoker Plugin to log that the build failed. More precisely, any non-null return value which does not equal true will be interpreted as a failure condition. And of course, if the script exits abnormally due to an exception, the plugin will flag the corresponding build as a failure, too.

Example verify.bsh

import java.io.*;

File file = new File( basedir, "target/my-test-project-1.0-SNAPSHOT.jar" );
if ( !file.isFile() )
{
    throw new FileNotFoundException( "Could not find generated JAR: " + file );
}

and similar verify.groovy

def file = new File( basedir, "target/my-test-project-1.0-SNAPSHOT.jar" )
assert file.isFile()

Predefined global variables

To allow the scripts to access some useful data about the test project, the following global variables will be defined by the Invoker Plugin before running the script:

Name Type Description Since
basedir java.io.File The absolute path to the base directory of the test project. 1.0
localRepositoryPath java.io.File The absolute path to the local repository used for the Maven invocation on the test project. 1.3
context java.util.Map The storage of key-value pairs used to pass data from the pre-build hook script to the post-build hook script. 1.4
context.get('userProperties') java.util.Properties The user properties for executing project 3.7.0
mavenVersion java.lang.String The version of Maven executing on the test project. 1.9

Additional variables that can be accessed in the hook scripts can be defined through the scriptVariables parameter in the Invoker Plugin's configuration.