Configuring Jetty With Exploded Web Archives
Abstract : Having a great number of useful features, Jetty is one of the most popular servlet containers around. In this post we are going to prepare our test-bed with Jetty using exploded web archives (WAR) without any integrated development environment (IDE) plugins (such as IntelliJ Jetty integration plug-in or Eclipse Jetty Plugin).
Goal : Prepare a Jetty-enabled test-bed using exploded WAR content
Acknowledgement : My gratitude goes to the open source community and to the following people:
Arthur Kahn for presenting me with this challenge and for his help
Step 1 : Download Jetty and extract the Jetty archive in a convenient for you directory. I'm going to use Jetty version 8.1.4 but hopefully this post will be still valid for other versions.
Step 2 : Let's say you've extracted Jetty in a directory called jetty_home. Make a copy of jetty.xml, called jetty-exploded-web.xml. You can find jetty.xml in jetty_home/etc and you should place jetty-exploded-web.xml there as well.
Step 3 : Make a directory under jetty_home called exploded-context-deploy. We will put the web application context files of our web projects in this directory.
Step 4 : Add the following few lines to jetty-exploded-web.xml just before the closing __ tag:
<!-- =========================================================== -->
<!-- exloded web archives options -->
<!-- =========================================================== -->
<Call name="addLifeCycle">
<Arg>
<New class="org.eclipse.jetty.deploy.ContextDeployer">
<Set name="contexts">
<Ref id="Contexts"/>
</Set>
<Set name="configurationDir">exploded-context-deploy</Set>
<Set name="scanInterval">1</Set>
</New>
</Arg>
</Call>
Step 5 : Say we have two web apps: web-app-1 and web-app-2. We are going to put the web context files of these web applications in the jetty_home/exploded-context-deploy directory. Both context files are quite similar except for the web app names, thus I'll post the content of web-app-1.xml only:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<Set name="contextPath">/web-app-1</Set>
<Set name="resourceBase">/absolute/path/to/web-app-1</Set>
</Configure>
Step 6 : Comment the line etc/jetty.xml in the jetty_home/start.ini file and add the line etc/jetty-exploded-web.xml. Here is an example of start.ini file:
#===========================================================
# Start classpath OPTIONS.
# These control what classes are on the classpath
# for a full listing do
# java -jar start.jar --list-options
#-----------------------------------------------------------
OPTIONS=Server,jsp,jmx,resources,websocket,ext,plus,annotations,overlay
#-----------------------------------------------------------
#===========================================================
# Configuration files.
# For a full list of available configuration files do
# java -jar start.jar --help
#-----------------------------------------------------------
etc/jetty-jmx.xml
#etc/jetty.xml
etc/jetty-exploded-web.xml
etc/jetty-annotations.xml
# etc/jetty-ssl.xml
# etc/jetty-requestlog.xml
etc/jetty-deploy.xml
#etc/jetty-overlay.xml
etc/jetty-webapps.xml
etc/jetty-contexts.xml
etc/jetty-testrealm.xml
Step 7 : In order to run Jetty on port 8090 you have to execute the following from jetty_home:
java -Djetty.port=8090 -jar start.jar
Note that if you don't provide the -Djetty.port=8090, Jetty will run on port 8080 by default.
Hot deploy : Note that Jetty is not going to automatically detect re-compiled Java classes, so one way to tell Jetty to reload a web app is to add a small change to the web app's context file. For example if you have re-compiled web-app-1 adding a new line to web-app-1.xml web context file and saving it will be enough for telling Jetty to reload the project.
Remote debugging : If you want to attach a debugger (i.e. when using Eclipse, IntelliJ, etc.) to Jetty on port 8008 you have to run Jetty as follows:
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8008 -jar start.jar
Extra classpaths : You can specify extra class paths for your web application by indicating this in the web context file, as follows:
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
...
<Set name="extraClasspath">/extra/classes,/extra/extra.jar</Set>
...
</Configure>