frontend-maven-plugin
This plugin downloads/installs Node and NPM locally for your project, runs npm install, and then any combination of Bower, Grunt, Gulp, Jspm, Karma, or Webpack. It's supposed to work on Windows, OS X and Linux.
If you prefer Yarn over NPM for your node package fetching, this plugin can also download Node and Yarn and then run yarn install for your project.
What is this plugin meant to do?
Let you keep your frontend and backend builds as separate as possible, by reducing the amount of interaction between them to the bare minimum; using only 1 plugin.
Let you use Node.js and its libraries in your build process without installing Node/NPM globally for your build system
Let you ensure that the version of Node and NPM being run is the same in every build environment
What is this plugin not meant to do?
Not meant to replace the developer version of Node - frontend developers will still install Node on their laptops, but backend developers can run a clean build without even installing Node on their computer.
Not meant to install Node for production uses. The Node usage is intended as part of a frontend build, running common javascript tasks such as minification, obfuscation, compression, packaging, testing etc.
Notice:This plugin does not support already installed Node or npm versions. Use the exec-maven-plugin instead.
Requirements
Maven 3.6* and Java 1.8
For Maven 2support take a look at the wiki.
Installation
Include the plugin as a dependency in your Maven project. Change LATEST_VERSION to the latest tagged version.
- ``` xml
- <plugins>
- <plugin>
- <groupId>com.github.eirslett</groupId>
- <artifactId>frontend-maven-plugin</artifactId>
- <version>LATEST_VERSION</version>
- ...
- </plugin>
- ...
- ```
Usage
Have a look at the example project, to see how it should be set up: https://github.com/eirslett/frontend-maven-plugin/blob/master/frontend-maven-plugin/src/it/example%20project/pom.xml
Installing node and npm
Installing node and yarn
Running
npm
yarn
bower
grunt
gulp
jspm
karma
webpack
Configuration
Working Directory
Installation Directory
Proxy Settings
Environment variables
Ignoring Failure
Skipping Execution
Recommendation:Try to run all your tasks via npm scripts instead of running bower, grunt, gulp etc. directly.
Installing node and npm
The versions of Node and npm are downloaded from https://nodejs.org/dist, extracted and put into a node folder created in your installation directory. Node/npm will only be "installed" locally to your project. It will not be installed globally on the whole system (and it will not interfere with any Node/npm installations already present).
- ``` xml
- <plugin>
- ...
- <executions>
- <execution>
- <phase>generate-resources</phase>
- </execution>
- </executions>
- <configuration>
- <nodeVersion>v4.6.0</nodeVersion>
- <npmVersion>2.15.9</npmVersion>
- <downloadRoot>http://myproxy.example.org/nodejs/
- </configuration>
- </plugin>
- ```
You can also specify separate download roots for npm and node as they are stored in separate repos. In case the root configured requires authentication, you can specify a server ID from your maven settings file:
- ``` xml
- <plugin>
- ...
- <configuration>
- <nodeDownloadRoot>http://myproxy.example.org/nodejs/
- <serverId>server001</serverId>
- <npmDownloadRoot>https://myproxy.example.org/npm/
- </configuration>
- </plugin>
- ```
You can use Nexus repository Manager to proxy npm registries. See https://help.sonatype.com/display/NXRM3/Npm+Registry
Notice:Remember to gitignore the node folder, unless you actually want to commit it.
Installing node and yarn
Instead of using Node with npm you can alternatively choose to install Node with Yarn as the package manager.
The versions of Node and Yarn are downloaded from https://nodejs.org/dist for Node and from the Github releases for Yarn, extracted and put into a node folder created in your installation directory. Node/Yarn will only be "installed" locally to your project. It will not be installed globally on the whole system (and it will not interfere with any Node/Yarn installations already present).
If your project is using Yarn Berry (2.x or above), the Yarn version is handled per project but a Yarn 1.x install is still needed as a "bootstrap". The plugin will try to detect .yarnrc.yml file in the current Maven project/module folder, at the root of the multi-module project if relevant, and in the folder from which the mvn command was run. If detected, the plugin will assume your project is using Yarn Berry. It will install the 1.x Yarn version you specify with yarnVersion as bootstrap, then hand over to your project-specific version.
Have a look at the example POM to see how it should be set up with Yarn: https://github.com/eirslett/frontend-maven-plugin/blob/master/frontend-maven-plugin/src/it/yarn-integration/pom.xml
- ``` xml
- <plugin>
- ...
- <execution>
- <phase>generate-resources</phase>
- </execution>
- <configuration>
- <nodeVersion>v6.9.1</nodeVersion>
- <yarnVersion>v0.16.1</yarnVersion>
- <nodeDownloadRoot>http://myproxy.example.org/nodejs/
- <yarnDownloadRoot>http://myproxy.example.org/yarn/
- </configuration>
- </plugin>
- ```
Running npm
All node packaged modules will be installed in the node_modules folder in your working directory. By default, colors will be shown in the log.
- ``` xml
- <execution>
- <id>npm install</id>
- <goals>
- <goal>npm</goal>
- </goals>
- <phase>generate-resources</phase>
- <configuration>
- <arguments>install</arguments>
- </configuration>
- </execution>
- ```
Notice:Remember to gitignore the node_modules folder, unless you actually want to commit it. Npm packages will always be installed in node_modules next to your package.json, which is default npm behavior.
npx
You can also use npx command, enabling you to execute the CLI of installed packages without a run-script, or even packages that aren't installed at all.
- ``` xml
- <execution>
- <id>say hello</id>
- <goals>
- <goal>npx</goal>
- </goals>
- <phase>generate-resources</phase>
- <configuration>
- <arguments>cowsay hello</arguments>
- </configuration>
- </execution>
- ```
Running yarn
As with npm above, all node packaged modules will be installed in the node_modules folder in your working directory.
- ``` xml
- <execution>
- <id>yarn install</id>
- <goals>
- <goal>yarn</goal>
- </goals>
- <configuration>
- <arguments>install</arguments>
- </configuration>
- </execution>
- ```
Yarn with Private Registry
NOTE: if you have a private npm registry that mirrors the npm registry, be aware that yarn.lock includes URLs to the npmjs.org module registry and yarn install will use these paths when installing modules.
If you want yarn.lock to use your private npm registry, be sure to run these commands on your local machine before you generate yarn.lock:
- ``` sh
- yarn config set registry <your_registry_url>
- yarn install
- ```
This will create URLs in your yarn.lock file that reference your private npm registry.
Another way to set a registry is to add a .npmrc file in your project's root directory that contains:
- ``` sh
- registry=<your_registry_url>
- ```
Also you can set a registry using a tag npmRegistryURL
- ``` sh
- <execution>
- <id>yarn install</id>
- <goals>
- <goal>yarn</goal>
- </goals>
- <configuration>
- <arguments>install</arguments>
- <npmRegistryURL>http://myregistry.example.org/
- </configuration>
- </execution>
- ```
Running bower
All bower dependencies will be installed in the bower_components folder in your working directory.
- ``` xml
- <execution>
- <id>bower install</id>
- <goals>
- <goal>bower</goal>
- </goals>
- <configuration>
- <arguments>install</arguments>
- </configuration>
- </execution>
- ```
Notice:Remember to gitignore the bower_components folder, unless you actually want to commit it.
Running Grunt
It will run Grunt according to the Gruntfile.js in your working directory. By default, colors will be shown in the log.
- ``` xml
- <execution>
- <id>grunt build</id>
- <goals>
- <goal>grunt</goal>
- </goals>
- <phase>generate-resources</phase>
- <configuration>
- <arguments>build</arguments>
- </configuration>
- </execution>
- ```
Running gulp
Very similar to the Grunt execution. It will run gulp according to the gulpfile.js in your working directory. By default, colors will be shown in the log.
- ``` xml
- <execution>
- <id>gulp build</id>
- <goals>
- <goal>gulp</goal>
- </goals>
- <phase>generate-resources</phase>
- <configuration>
- <arguments>build</arguments>
- </configuration>
- </execution>
- ```
Running jspm
All jspm dependencies will be installed in the jspm_packages folder in your working directory.
- ``` xml
- <execution>
- <id>jspm install</id>
- <goals>
- <goal>jspm</goal>
- </goals>
- <configuration>
- <arguments>install</arguments>
- </configuration>
- </execution>
- ```
Running Karma
- ``` xml
- <execution>
- <id>javascript tests</id>
- <goals>
- <goal>karma</goal>
- </goals>
- <phase>test</phase>
- <configuration>
- <karmaConfPath>src/test/javascript/karma.conf.ci.jskarmaConfPath>
- </configuration>
- </execution>
- ```
Skipping tests:If you run maven with the -DskipTests flag, karma tests will be skipped.
Ignoring failed tests:If you want to ignore test failures run maven with the -Dmaven.test.failure.ignore flag, karma test results will not stop the build but test results will remain in test output files. Suitable for continuous integration tool builds.
Why karma.conf.ci.js?When using Karma, you should have two separate configurations: karma.conf.js and karma.conf.ci.js. (The second one should inherit configuration from the first one, and override some options. The example project shows you how to set it up.) The idea is that you use karma.conf.js while developing (using watch/livereload etc.), and karma.conf.ci.js when building - for example, when building, it should only run karma once, it should generate xml reports, it should run only in PhantomJS, and/or it should generate code coverage reports.
Running Karma through Grunt or gulp:You may choose to run Karma directly through Grunt or through gulp instead, as part of the grunt or gulp execution. That will help to separate your frontend and backend builds even more.
Running Webpack
- ``` xml
- <execution>
- <id>webpack build</id>
- <goals>
- <goal>webpack</goal>
- </goals>
- <phase>generate-resources</phase>
- <configuration>
- <arguments>-p</arguments>
- </configuration>
- </execution>
- ```
Optional Configuration
Working directory
The working directory is where you've put package.json and your frontend configuration files (Gruntfile.js or gulpfile.js etc). The default working directory is your project's base directory (the same directory as your pom.xml ). You can change the working directory if you want:
- ``` xml
- <plugin>
- <groupId>com.github.eirslett</groupId>
- <artifactId>frontend-ma