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.4</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 ScriptInterpreter

Interpret BeanShell script

    ScriptInterpreter interpreter = new BeanShellScriptInterpreter();
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    interpreter.evaluateScript( script content, extra classPath entries,
                                Map<String, ? extends Object> globalVariables, new PrintStream( out ) );

out.toString() returns script output.

Interpret a Groovy script

    ScriptInterpreter interpreter = new GroovyScriptInterpreter();
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    interpreter.evaluateScript( script content, extra classPath entries,
                                Map<String, ? extends Object> globalVariables, new PrintStream( out ) );

out.toString() returns script output.

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.

    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:

      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.

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

Additionnal classpath entries

You can add some additional classpath entries for your script execution

    List<String> classpathEntries = list of jar paths
    ScriptRunner scriptRunner = new ScriptRunner();
    scriptRunner.setClassPath( classpathEntries );
    scriptRunner.run( "test", new File( "src/test/resources/bsh-test" ), "verify", buildContext(),
                      new FileLogger( logFile ) );