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.6</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)); }