nashorn-maven-plugin
allows execute little piece of Javascript code during build. It is lightweight
alternative to implement regular plugin
Let say you want touch file 'x' during build. Classic Ant way:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<phase>process-resources</phase>
<configuration>
<target>
<touch file="${basedir}/x" />
</target>
</configuration>
<goals><goal>run</goal></goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Nashorn way:
<build>
<plugins>
<plugin>
<groupId>io.github.michaldo</groupId>
<artifactId>nashorn-maven-plugin</artifactId>
<version>0.0.2</version>
<executions>
<execution>
<phase>process-resources</phase>
<goals><goal>eval</goal></goals>
<configuration>
<script>
var path = java.nio.file.Paths.get($basedir, 'x');
var Files = Java.type('java.nio.file.Files');
if (!Files.exists(path)) {
Files.createFile(path);
} else {
var FileTime = Java.type('java.nio.file.attribute.FileTime');
Files.setLastModifiedTime(path, FileTime.from(java.time.Instant.now()))
}
</script>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
No benefit of Nashorn way. But let say you have multi-module project with many jar and war module and you want to touch 'x' only for war module. For Ant it's impossible, huh? For Nashorn it is pretty easy
<build>
<plugins>
<plugin>
<groupId>io.github.michaldo</groupId>
<artifactId>nashorn-maven-plugin</artifactId>
<version>0.0.2</version>
<executions>
<execution>
<phase>process-resources</phase>
<goals><goal>eval</goal></goals>
<configuration>
<script>
if ($project.packaging != 'war') return;
var path = java.nio.file.Paths.get($basedir, 'x');
var Files = Java.type('java.nio.file.Files');
if (!Files.exists(path)) {
Files.createFile(path);
} else {
var FileTime = Java.type('java.nio.file.attribute.FileTime');
Files.setLastModifiedTime(path, FileTime.from(java.time.Instant.now()))
}
</script>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<plugin>
<groupId>io.github.michaldo</groupId>
<artifactId>nashorn-maven-plugin</artifactId>
<version>0.0.2</version>
<executions>
<execution>
<phase>initialize</phase>
<goals><goal>eval</goal></goals>
<configuration>
<script>
print('hello world');
</script>
</configuration>
</execution>
</executions>
</plugin>
nashorn:eval
: executes javascript code
script
: required script code
The following Maven objects are injected in Javascript space
Variable | Class |
---|---|
$project | actual MavenProject |
$session | MavenSession |
$mojo | MojoExecution |
$plugin | MojoExecution.getMojoDescriptor().getPluginDescriptor() |
$settings | MavenSession.getSettings() |
$localRepository | MavenSession.getLocalRepository()() |
$reactorProjects | MavenSession.getProjects() |
$repositorySystemSession | MavenSession.getRepositorySession() |
$executedProject | MavenProject.getExecutionProject() |
$basedir | MavenProject.getBasedir() |
Maven 3.1
Java 8