npm --global rm gulp
02 July 2016
This article is a quick start guide on scaffolding a basic webapp with Node and Gulp but JEE ready. Armed with nothing more than a text editor and a terminal we’ll put down a basic but working site using Gulp to test-drive it and using Node to manage the dependencies you will need later, including Gulp itself.
Firstly I’m assuming you already have a recent version of NodeJS (including the NPM package manager) installed. If not please install Node first using instructions appropriate for your platform. See the NodeJS website for the available options. Personally I think you best use your platform’s package manager to install and maintain your NodeJS installation. This includes Apple OSX users that should be using Homebrew anyway to manage Linux-ish packages. Windows users will have to stick to the native installer app.
Secondly it is advised to remove a potential pre-existing system-wide (global) gulp Node module to make sure it does not interfere with the gulp-cli module you will be installing globally. Besides, you will be using a project-local version of Gulp as a development scoped dependency so you do not need a globally installed version. To remove a global installed gulp version:
npm --global rm gulp
Now do install gulp-cli globally:
npm --global install gulp-cli
We adopt the common structure as used in the java/groovy community, following the default structure of build tools like maven and gradle:
project_name=<your_project_name_here>
mkdir ${project_name}
cd ${project_name}
mkdir -p src/main/web/style
mkdir -p src/main/web/html
mkdir -p src/main/web/script
mkdir -p src/main/web/image/icon
Create a local Node environment in your project:
npm init
Just answer the questions as best as you can ;-)
Now add the gulp module as a development dependency to Node’s package.json:
npm install --save-dev gulp
To serve-up your site and auto-reload it in your browser while working on it we will add the browser-sync module as development dependency:
npm install --save-dev browser-sync
Create a descriptor file for Gulp:
touch gulpfile.js
Now open it in your text editor and copy-in the following contents:
var gulp = require('gulp');
var browserSync = require('browser-sync');
var reload = browserSync.reload;
var appRoot = 'src/main/web'
// default task, doing nop
gulp.task('default', function() {
});
// watch files for changes and auto-reload
gulp.task('serve', function() {
browserSync({
server: {
baseDir: appRoot
}
});
gulp.watch(['*.html', 'html/**/*.html', 'style/**/*.css', 'script/**/*.js'], {cwd: appRoot}, reload);
});
We added two taskes here: the default task and the serve task. For the default task we do not have anything to do yet. The serve task however will trigger the browser-sync module. In the task definition we specify how our site is structured so that it will know wich files to serve and which to watch to trigger the auto-reload functionality.
Firstly scaffold your site with an empty index.html wiring-in an empty stylesheet and javascript file:
touch src/main/web/index.html touch src/main/web/style/styles.css touch src/main/web/script/app.js
Open src/main/web/index.html in a text editor an copy-in the following contents:
<html>
<head>
<title>${project_name}</title>
<link rel="stylesheet" type="text/css" href="style/styles.css"/>
<script type="text/javascript" src="script/app.js"></script>
</head>
<body>
<h1>Hello World</h1>
<p>Lorum ipsum...</p>
</body>
</html>
Now for the fun-part: You will use Gulp to serve your site on your local machine and auto-reload it in your browser while editing your html, style and script files:
gulp serve
When you plan on deploying on a JEE application server such as Jetti or Tomcat you’ll need a deployment descriptor matching the Servlet specification used in your Java code and supported by your target server. In this example I assume you’ll settle for the current Servlet 3.1 specification from Java EE7 which is supported by Tomcat 8.5 amongst others.
For other Servlet specs you need to use a different XSD schema specification for your web.xml. See these examples for the schema’s matching the older Servlet 3.0, 2.5, 2.4 and 2.3 specifictions. If Tomcat is your appserver of choice, use this version table to figure out which servlet spec you should specify in your web descriptor.
First create the web descriptor file:
mkdir -p src/main/webapp/WEB-INF touch src/main/webapp/WEB-INF/web.xml
Now open it src/main/webapp/WEB-INF/web.xml in a text editor and copy-in the following contents. Either replace the variable ${project_name} with your actual project name, or leave it as-is when you are planning on using a resource filter from a maven build to substitute it at build time later:
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>${project_name}</display-name>
</web-app>
Older posts are available in the archive.