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 scriptcontext: 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));
}


