Apache Maven Script Interpreter

This component provides some utilities to interpret/execute some scripts for various implementations: groovy or beanshell.

Dependency declaration

<dependency>
  <groupId>org.apache.maven.shared</groupId>
  <artifactId>maven-script-interpreter</artifactId>
  <version>1.5</version>
</dependency>

maven-script-interpreter has dependency only to core interpreters library, all specific extensions should be added in your project.

For example, if you want to use Grape in a Groovy script, you must add a dependency to Ivy in your project or in the plugin that will invoke the script:

<dependency>
  <groupId>org.apache.ivy</groupId>
  <artifactId>ivy</artifactId>
  <version>...</version>
</dependency>

Using ScriptRunner

ScriptRunner class will detect the script file to run based on supported extensions (.bsh, .groovy).

This class will search in the provided directory the script with the provided fileName and the supported extensions.

See javadoc for run(...) methods.

try (ScriptRunner scriptRunner = new ScriptRunner()) {
    scriptRunner.run("test", new File("src/test/resources/bsh-test"), "verify", buildContext(),
            new FileLogger(logFile));
}

Mirror output from script interpreter

In order to do something more with script output, eg. log by your application you must implement FileLoggerMirrorHandler

class MyMirrorHandler implements FileLoggerMirrorHandler {
    void consumeOutput(String message) {
        // this method is invoked every time when flush occurs on the underlying stream.
    }
}

Now use it:

try (ScriptRunner scriptRunner = new ScriptRunner()) {
    scriptRunner.run("test", new File("src/test/resources/bsh-test"), "verify", buildContext(),
            new FileLogger(logFile, new MyMirrorHandler()));
}

Global variables

Your scripts will have by default two global variables:

  • basedir: the base directory of your script
  • context: the build context (see below)

You can add more global variables as it.

try (ScriptRunner scriptRunner = new ScriptRunner()) {
    scriptRunner.setGlobalVariable( name, value );
    ...
}

Build context

You can pass some values to your script using an execution context which have the type Map<String, ? extends Object> context:

private Map<String, Object> buildContext() {
    Map<String, Object> context = new HashMap<String, Object>();
    context.put("foo", "bar");
    return context;
}

Then values are available in scripts context:

// in your bsh script
String value = context.get( "foo" );

value will be "bar"

// in your Groovy script
context.get("foo")

Additional classpath entries

You can add some additional classpath entries for your script execution

List<String> classpathEntries = list of jar paths

try (ScriptRunner scriptRunner = new ScriptRunner()) {
    scriptRunner.setClassPath( classpathEntries );
    scriptRunner.run("test", new File("src/test/resources/bsh-test"), "verify", buildContext(),
            new FileLogger(logFile));
 }