Play! is a great framework for java-base development of modern web applications. Unfortunately, the documentation about deployment options is not really that extensive in certain details. I want to describe a way to automatically build a self-contained zip archive without the source code. The documentation does state that using the standalone web server is preferred so we will use that option.
Our goal is:
- an artifact with the executable application
- no sources in the artifact
- startup script for different platform and environments
- CI integration with execution of the tests
Fortunately, the play framework makes most of this quite easy if you know some small tricks.
The first very important step towards our goal is embedding the whole Play! framework somewhere in your project directory. I like to put it into lib/play-x.y.z
(x.y.z
being the framework version). That way you can do perform all neccessary calls to play scripts using relative paths and provide a self-contained artifact which developers or clients may download and execute on their machine. You can also be sure everyone is using the correct (read “same”) framework version.
The next important thing is to write some small start-scripts so you can demo the software easily on any machine with Java installed. Your clients may try it out theirselves if the project policy is open enough. Here are small examples for linux
#!/bin/sh python lib/play-1.2.3/play run --%demo -Dprecompiled=true
and windows
REM start our app in the "demo" environment lib\play-1.2.3\play run --%%demo -Dprecompiled=true
The last ingredient to a great deployment and demoing experience is the build script which builds, tests and packages the software together. We do not want to include the sources in the artifact, so there is a bit of work to do. We perform following steps in the script:
- delete old artifacts to ensure a clean build
- call play to precompile our application
- call play to execute all our automatic tests
- copy all needed files into our distribution directory ready to be packed together
- pack the artifacts into a zip archive
Our sample build script is for the linux shell but you can easily translate it to the scripting environment of your choice, be it apache ant, gradle, windows batch depending on your needs and preference:
#!/bin/sh rm -r dist rm -r test-result rm -r precompiled python lib/play-1.2.3/play precompile python lib/play-1.2.3/play auto-test TARGET=dist/my_project mkdir -p $TARGET/app cp -r app/views $TARGET/app cp -r conf lib modules precompiled public $TARGET cp programs/my_project* $TARGET cd dist && zip -r my_project.zip my_project
Now we can hook the project into a continuous integration server like Jenkins and let it archive the build artifact containing an executable installation of our web application. You could grant your client direct access to the artifact, use it for demos and further deployment steps like triggered upload to a staging server or the like.