Jetty/Howto/Use Jetty with Ant
Contents
Introduction
The Ant Jetty plugin is in the codehouse trunk in the jetty-ant module. This plugin makes it possible to start a Jetty web server directly from the Ant build script, and, to embed the Jetty web server inside your build process. Its purpose is to provide almost the same functionality as the Jetty plugin for Maven: dynamic application reloading, working directly on web application sources, and a tight integration with the build system.
Preparation
You will need a jetty distribution and the jetty-ant jar in order to set up your project for ant to run jetty:
- Get a jetty distribution and unpack it the local filesystem
- Get the jetty-ant jar
- Make a directory in your project called jetty-lib/
- Copy all of the jars in your jetty distribution's lib directory, and all its subdirectories, into your new jetty-lib dir. When copying the jars, DON'T preserve the jetty distro's lib dir hierarchy - all the jars should be directly inside your jetty-lib dir.
- Also copy the jetty-ant jar you downloaded earlier into the jetty-lib dir.
- Make a directory in your project called jetty-temp
Now you're ready to edit or create your Ant build.xml file.
Preparing the build.xml file
Let's start with an empty build.xml:
<project name="Jetty-Ant integration test" basedir="."> </project>
Then, you must define a jetty task:
<project name="Jetty-Ant integration test" basedir="."> <path id="jetty.plugin.classpath"> <fileset dir="jetty-lib" includes="*.jar"/> </path> <taskdef classpathref="jetty.plugin.classpath" resource="tasks.properties" loaderref="jetty.loader" /> </project>
Now you are ready to add a new target with Jetty container declaration:
<project name="Jetty-Ant integration test" basedir="."> <path id="jetty.plugin.classpath"> <fileset dir="jetty-lib" includes="*.jar"/> </path> <taskdef classpathref="jetty.plugin.classpath" resource="tasks.properties" loaderref="jetty.loader" /> <target name="jetty.run"> <jetty /> </target> </project>
This is the minimal configuration need. You can now start jetty.
Starting Jetty via Ant
At the command line do:
ant jetty.run
Deploying web applications
To add web applications to the Jetty web server, now put extra webapp tags inside jetty tag. Notice, that a tempDirectory attribute has been added to the jetty task to specify where temporary files are stored.
<project name="Jetty-Ant integration test" basedir="."> <path id="jetty.plugin.classpath"> <fileset dir="jetty-lib" includes="*.jar"/> </path> <taskdef classpathref="jetty.plugin.classpath" resource="tasks.properties" loaderref="jetty.loader" /> <target name="jetty.run"> <jetty tempDirectory="jetty-temp"> <webApp name="webapp1" warfile="webapp1.war" contextpath="/webapp1" /> </jetty> </target> </project>
You can put many webapp tags inside jetty tag, thus deploying many web applications simultaneously.
A Special Note on Using JSPs with JSTL Or Other Taglibs
If your webapp uses a taglib that should be found on the container classpath (such as JSTL) you will need to pass in some extra information to the webapp to tell jetty which container jars can contain the taglibs. This is defined as a set of jar name patterns.
If you are using JSTL, and are using the jars provided by the standard jetty distribution, the JSTL taglibs are located in the jar named something like org.apache.taglibs.standard.glassfish_1.2.0.xxxx.jar (where xxx is replaced by a specific version number).
The following pattern defines all jars that contain the string "jsp-api" or "jsp" or "taglibs" as jars that will be searched at runtime for taglibs:
.*/.*jsp-api-[^/]*\.jar$|.*/.*jsp-[^/]*\.jar$|.*/.*taglibs[^/]*\.jar$
This pattern should be added to your <webApp/> declaration as the value of a context attribute named org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern. Here's how the modified build.xml file looks now:
<project name="Jetty-Ant integration test" basedir="."> <path id="jetty.plugin.classpath"> <fileset dir="jetty-lib" includes="*.jar"/> </path> <taskdef classpathref="jetty.plugin.classpath" resource="tasks.properties" loaderref="jetty.loader" /> <target name="jetty.run"> <jetty tempDirectory="jetty-temp"> <webApp name="webapp1" warfile="webapp1.war" contextpath="/webapp1"> <attributes> <attribute name="org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern" value=".*/.*jsp-api-[^/]*\.jar$|.*/.*jsp-[^/]*\.jar$|.*/.*taglibs[^/]*\.jar$"/> </attributes> </webApp> </jetty> </target> </project>
Plugin syntax
There are many ways to configure jetty tasks:
- tempDirectory–specifies the Jetty temporary web directory:
<jetty tempDirectory="jetty-temp" />
- requestLog–defines a request logger:
<jetty ... requestLog="your.fancy.request.logger"/>
- jettyXml–applies additional configuration via a standard jetty.xml file:
<jetty ... jettyXml="path/to/jetty.xml"/>
- systemProperties–adds system properties when starting Jetty:
<jetty ...> <systemProperties> <systemProperty name="jetty.status" value="Jetty Rocks!"/> </systemProperties> </jetty>
- connectors–defines Jetty connectors:
<typedef name="selectChannelConnector" classname="org.eclipse.jetty.nio.SelectChannelConnector" classpathref="jetty.plugin.classpath" loaderref="jetty.loader" /> ... <jetty ...> <connectors> <selectChannelConnector port="8090" /> </connectors> </jetty>
- loginServices - adds authentication via user "realms":
> <typedef name="hashLoginService" classname="org.eclipse.jetty.security.HashLoginService" classpathref="jetty.plugin.classpath" loaderref="jetty.loader" /> ... <jetty ...> <loginServices> <hashLoginService name="realm1" config="path/to/realm/config" /> </loginServices> </jetty>
There are also many ways to configure web applications with webapp tag:
- name–name of a web application, which is used by DefaultServlet to display application description:
<jetty ...> <webapp name="name" .../> </jetty>
- warfile–path to .war file or a directory with web application contents:
<jetty ...> <webapp warfile="/path/to/war/file/or/web/application/contents" .../> </jetty>
- contextPath–a context path a particular web application will be deployed to, and thus where it will be accessible (http://localhost:8080/webapp in this case):
<jetty ...> <webapp contextPath="/webapp" .../> </jetty>
- jettyEnvXml–path to jettyEnv.xml file with JNDI resource declarations:
<jetty ...> <webapp jettyEnvXml="/path/to/jettyEnv.xml" .../> </jetty>
- webXml–path to web.xml file. If not specified, the default (location-of-war-file/WEB-INF/web.xml) location is used:
<jetty ...> <webapp webXmlFile="/path/to/web/xml" .../> </jetty>
- scanTargets and scanIntervalSeconds–points to special files/folders that need to be scanned, and specifies scanner interval in seconds. If any of the files changes, the web application is automatically reloaded. You can adjust interval and scanned files per web application.
<jetty ...> <webapp ... scanIntervalSeconds="5"> <scanTargets dir="path/to/included/resources"> <include name="filename/patterns" /> </scanTargets> </webapp> </jetty>
- lib–specifies which libraries need be included for a particular web application (treated as files inside WEB-INF/lib folder). Multiple lib tags are allowed.
<jetty ...> <webapp ...> <lib dir="path/to/jar/folder" includes="*.jar" excludes="not-needed.jar" /> </webapp> </jetty>
- classes–specifies which folder contains web application classes (treated as WEB-INF/classes folder). Multiple classes tags are allowed.
<jetty ...> <webapp ...> <classes dir="path/to/classes/folder" includes="*.class" /> </webapp> </jetty>
- connectors–specifies additional web application connectors