Skip to content

Latest commit

 

History

History
147 lines (130 loc) · 4.95 KB

README.md

File metadata and controls

147 lines (130 loc) · 4.95 KB

nashorn-maven-plugin

Purpose

nashorn-maven-plugin allows execute little piece of Javascript code during build. It is lightweight alternative to implement regular plugin

Example

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>

Usage

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

Goals

nashorn:eval: executes javascript code

Parameters

script : required script code

Maven API

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

Requirements

Maven 3.1

Java 8