How to deploy a node.js app with maven?

Most of our team consists of java developers and therefore the whole build / deployment / dependency management system is built on top of maven. We use CI so every build process runs unit test (w. karma and phantomJS for the frontend, and jasmine-node for the backend). I've managed to configure a karma maven plugin for this purpose.

This does not solve the issue of downloading node.js dependencies from package.json on build. I need to deploy my node.js / express app in existing environment, so the perfect scenario would be:

  1. pull from the repo (done automatically with maven build)
  2. npm install (that is - downloading dependencies from node package registry)
  3. running tests

I was trying to find a nodejs package for maven, but to be honest - as a node.js developer I do not feel very confident when it comes to choosing the right tools, since I'm not able to distinguish a bad maven plugin from a decent one.

Maybe using a shell plugin and invoking npm install from the terminal is a better choice?

What's your opinion?

I think you can find the answer in Grunt and the many available plugins.

I'm actually working on a web project where the client-side is made with AngularJS. Nevertheless, I think the deployement process may partially answer to your question :

In your pom.xml, you can do something like that :

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.5</version>
    <executions>
        <execution>
            <id>exec-gen-sources</id>
            <phase>generate-sources</phase>
            <configuration>
                <target name="Build Web">

                    <echo>--- NPM INSTALL ---</echo>

                    <exec executable="cmd" dir="${project.basedir}"
                        failonerror="true" osfamily="windows">
                        <arg line="/c npm install" />
                    </exec>

                    <echo>--- BOWER INSTALL ---</echo>

                    <exec executable="cmd" dir="${project.basedir}"
                        failonerror="true" osfamily="windows">
                        <arg line="/c bower install --no-color" />
                    </exec>

                    <echo>--- GRUNT RELEASE ---</echo>

                    <exec executable="cmd" dir="${project.basedir}"
                        failonerror="true" osfamily="windows">
                        <arg line="/c grunt release --no-color --force" />
                    </exec>

                </target>
            </configuration>
            <goals>
                <goal>run</goal>
            </goals>
        </execution>
    </executions>
</plugin>

First part is the "npm install" task : downloading of dependencies from node package. Second part is the "bower install" task : downoading of other dependencies with bower (in my case, angularJS, but you might not need this part) Third part is the "Grunt Release" part : launching a Grunt task that includes karma unit testing.

You can find documentation about grunt here http://gruntjs.com/. There are many available plugins like karma unit testing.

I hope this helped you.

You've got two choices:

As a hacky solution, though still feasible you could as you've mentioned yourself, use something like maven-antrun-plugin to actually execute npm with maven.

All approaches have their pros and cons, but frontend-maven-plugin seems to be the most often used approach - but it assumes that your ci server can download from the internet arbitrary packages, whereas the "hacky" solution should also work, when your ci server has no connection to the internet at all (besides proxying the central maven repo)