Jump to: navigation, search

Difference between revisions of "Jetty/Howto/Use Jetty with Ant"

< Jetty‎ | Howto
m
m
Line 7: Line 7:
 
Modifying build.xml from jetty-ant-demo is also the easiest way to start playing with this plugin.
 
Modifying build.xml from jetty-ant-demo is also the easiest way to start playing with this plugin.
 
}}
 
}}
==Beginning To Use Ant==
+
==Beginning to Use Ant==
  
 
The Ant plugin depends on Jetty JARs, and so far it's necessary to build Jetty and then the Ant plugin directly from sources. Here's how it goes:
 
The Ant plugin depends on Jetty JARs, and so far it's necessary to build Jetty and then the Ant plugin directly from sources. Here's how it goes:
Line 14: Line 14:
 
# Unpack jetty and build it with 'mvn install' (If you don't have Maven yet, get it from http://maven.apache.org/)
 
# Unpack jetty and build it with 'mvn install' (If you don't have Maven yet, get it from http://maven.apache.org/)
 
# Go to the extras/ant/ folder and build ant plugin with 'mvn install'
 
# Go to the extras/ant/ folder and build ant plugin with 'mvn install'
# Go to <your M2 repo root>/repository/org/eclipse/jetty/jetty-ant and grab the jetty-ant plugin JAR.
+
# Go to <your M2 repo root>/repository/org/eclipse/jetty/jetty-ant and get the jetty-ant plugin JAR.
 
# Get these files to run Jetty with JSP/Servlets support (find these in <your M2 repo root>/repository/org/eclipse/jetty):
 
# Get these files to run Jetty with JSP/Servlets support (find these in <your M2 repo root>/repository/org/eclipse/jetty):
 
#* jetty.jar
 
#* jetty.jar
Line 80: Line 80:
 
   </target>
 
   </target>
 
</project>
 
</project>
 
 
</source>
 
</source>
  
Line 89: Line 88:
 
====There are many ways to configure ''jetty'' task:====
 
====There are many ways to configure ''jetty'' task:====
  
* ''tempDirectory'' - specifies the Jetty temporary web directory: <div class="code panel" style="border-width: 1px"><div class="codeContent panelContent">  
+
* ''tempDirectory'' - specifies the Jetty temporary web directory:  
 +
<source lang="xml">
 
  <jetty tempDirectory="jetty-temp" />
 
  <jetty tempDirectory="jetty-temp" />
</div></div><br class="atl-forced-newline" /><br class="atl-forced-newline" /><br class="atl-forced-newline" /><br class="atl-forced-newline" />
+
</source>
* ''requestLog'' - defines a request logger: <div class="code panel" style="border-width: 1px"><div class="codeContent panelContent">  
+
* ''requestLog'' - defines a request logger:  
 +
<source lang="xml">  
 
  <jetty ... requestLog="your.fancy.request.logger"/>
 
  <jetty ... requestLog="your.fancy.request.logger"/>
</div></div><br class="atl-forced-newline" /><br class="atl-forced-newline" /><br class="atl-forced-newline" /><br class="atl-forced-newline" />
+
</source>
* ''jettyXml'' - applies additional configuration via a standard jetty.xml file: <div class="code panel" style="border-width: 1px"><div class="codeContent panelContent">  
+
* ''jettyXml'' - applies additional configuration via a standard jetty.xml file:  
 +
<source lang="xml">  
 
  <jetty ... jettyXml="path/to/jetty.xml"/>
 
  <jetty ... jettyXml="path/to/jetty.xml"/>
</div></div><br class="atl-forced-newline" /><br class="atl-forced-newline" /><br class="atl-forced-newline" /><br class="atl-forced-newline" />
+
</source></div>
* ''systemProperties'' - adds system properties when starting Jetty: <div class="code panel" style="border-width: 1px"><div class="codeContent panelContent">  
+
* ''systemProperties'' - adds system properties when starting Jetty:  
 +
<source lang="xml">  
 
  <jetty ...>
 
  <jetty ...>
 
   <systemProperties>
 
   <systemProperties>
Line 104: Line 107:
 
   </systemProperties>
 
   </systemProperties>
 
  </jetty>
 
  </jetty>
</div></div><br class="atl-forced-newline" /><br class="atl-forced-newline" /><br class="atl-forced-newline" /><br class="atl-forced-newline" />
+
</source>
* ''connectors'' - defines Jetty connectors (a better way still needs to be developed): <div class="code panel" style="border-width: 1px"><div class="codeContent panelContent">  
+
* ''connectors'' - defines Jetty connectors (a better way still needs to be developed):  
 +
<source lang="xml">  
 
  <typedef name="selectChannelConnector" classname="org.mortbay.jetty.nio.SelectChannelConnector"
 
  <typedef name="selectChannelConnector" classname="org.mortbay.jetty.nio.SelectChannelConnector"
 
                             classpathref="jetty.plugin.classpath" loaderref="jetty.loader" />
 
                             classpathref="jetty.plugin.classpath" loaderref="jetty.loader" />
Line 114: Line 118:
 
   </connectors>
 
   </connectors>
 
  </jetty>
 
  </jetty>
</div></div><br class="atl-forced-newline" /><br class="atl-forced-newline" /><br class="atl-forced-newline" />
+
</source>  
* <div class="code panel" style="border-width: 1px"><div class="codeContent panelContent">
+
* ''userRealms'' - adds authentication via user "realms":  
+
<source lang="xml">>  
</div></div><br class="atl-forced-newline" /><br class="atl-forced-newline" /><br class="atl-forced-newline" /><br class="atl-forced-newline" />
+
* ''userRealms'' - adds authentication via user "realms": <div class="code panel" style="border-width: 1px"><div class="codeContent panelContent">  
+
 
  <typedef name="jdbcRealm" classname="org.mortbay.jetty.security.HashUserRealm"
 
  <typedef name="jdbcRealm" classname="org.mortbay.jetty.security.HashUserRealm"
 
                   classpathref="jetty.plugin.classpath" loaderref="jetty.loader" />
 
                   classpathref="jetty.plugin.classpath" loaderref="jetty.loader" />
Line 127: Line 129:
 
   </userRealms>
 
   </userRealms>
 
  </jetty>
 
  </jetty>
</div></div><br class="atl-forced-newline" /><br class="atl-forced-newline" /><br class="atl-forced-newline" />
+
</source>
* <div class="code panel" style="border-width: 1px"><div class="codeContent panelContent">
+
+
</div></div><br class="atl-forced-newline" /><br class="atl-forced-newline" /><br class="atl-forced-newline" /><br class="atl-forced-newline" />
+
  
====There are also many ways to configure web applications with ''webapp'' tag:====
+
====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 <div class="code panel" style="border-width: 1px"><div class="codeContent panelContent">  
+
* ''name'' - name of a web application, which is used by DefaultServlet to display application description  
 +
<source lang="xml">  
 
  <jetty ...>
 
  <jetty ...>
 
   <webapp name="name" .../>
 
   <webapp name="name" .../>
 
  </jetty>
 
  </jetty>
</div></div><br class="atl-forced-newline" /><br class="atl-forced-newline" /><br class="atl-forced-newline" /><br class="atl-forced-newline" />
+
</source>
* ''warfile'' - path to .war file or a directory with web application contents: <div class="code panel" style="border-width: 1px"><div class="codeContent panelContent">  
+
* ''warfile'' - path to .war file or a directory with web application contents:  
 +
<source lang="xml">  
 
  <jetty ...>
 
  <jetty ...>
 
   <webapp warfile="/path/to/war/file/or/web/application/contents" .../>
 
   <webapp warfile="/path/to/war/file/or/web/application/contents" .../>
 
  </jetty>
 
  </jetty>
</div></div><br class="atl-forced-newline" /><br class="atl-forced-newline" /><br class="atl-forced-newline" /><br class="atl-forced-newline" />
+
</source>
* ''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): <div class="code panel" style="border-width: 1px"><div class="codeContent panelContent">  
+
* ''contextPath'' - a context path a particular web application will be deployed to, and thus where it will be accessible (<tt>http://localhost:8080/webapp</tt> in this case):  
 +
<source lang="xml">  
 
  <jetty ...>
 
  <jetty ...>
 
   <webapp contextPath="/webapp" .../>
 
   <webapp contextPath="/webapp" .../>
 
  </jetty>
 
  </jetty>
</div></div><br class="atl-forced-newline" /><br class="atl-forced-newline" /><br class="atl-forced-newline" /><br class="atl-forced-newline" />
+
</source>
* ''jettyEnvXml'' - path to [http://docs.codehaus.org/display/JETTY/jetty-env.xml jettyEnv.xml file with JNDI resource declarations]<div class="code panel" style="border-width: 1px"><div class="codeContent panelContent">  
+
* ''jettyEnvXml'' - path to [http://docs.codehaus.org/display/JETTY/jetty-env.xml jettyEnv.xml file with JNDI resource declarations]
 +
<source lang="xml">  
 
  <jetty ...>
 
  <jetty ...>
 
   <webapp jettyEnvXml="/path/to/jettyEnv.xml" .../>
 
   <webapp jettyEnvXml="/path/to/jettyEnv.xml" .../>
Line 158: Line 161:
 
   <webapp webXmlFile="/path/to/web/xml" .../>
 
   <webapp webXmlFile="/path/to/web/xml" .../>
 
  </jetty>
 
  </jetty>
</div></div><br class="atl-forced-newline" /><br class="atl-forced-newline" /><br class="atl-forced-newline" /><br class="atl-forced-newline" />
+
</div>
* ''scanTargets'' and ''scanIntervalSeconds'' - used to point to a special files/folders which need to be scanned and specify scanner interval in seconds respectively. If any of files changes the web application is being automatically reloaded. Scan interval and scanned files can be adjusted per web application.<br />'''IMPORTANT'''<nowiki>: Please note, that all files included with <classes/> or <lib/> tags are </nowiki>'''automatically''' scanned for changes if you provide ''scanIntervalSeconds'' parameter in the <jetty/> tag. There's no need to add them using the <scanTargets/> section. <div class="code panel" style="border-width: 1px"><div class="codeContent panelContent">  
+
* ''scanTargets'' and ''scanIntervalSeconds'' - used to point to a special files/folders which need to be scanned and specify scanner interval in seconds respectively. If any of files changes the web application is being automatically reloaded. Scan interval and scanned files can be adjusted per web application.<br />'''IMPORTANT'''<nowiki>: Please note, that all files included with <classes/> or <lib/> tags are </nowiki>'''automatically''' scanned for changes if you provide ''scanIntervalSeconds'' parameter in the <jetty/> tag. There's no need to add them using the <scanTargets/> section.  
 +
<source lang="xml">
 
  <jetty ...>
 
  <jetty ...>
 
   <webapp ... scanIntervalSeconds="5">
 
   <webapp ... scanIntervalSeconds="5">
Line 167: Line 171:
 
   </webapp>
 
   </webapp>
 
  </jetty>
 
  </jetty>
</div></div><br class="atl-forced-newline" /><br class="atl-forced-newline" /><br class="atl-forced-newline" /><br class="atl-forced-newline" />
+
</source>
* ''lib'' - specifies which libraries needs to be included for a particular web application (treated as files inside WEB-INF/lib folder). Multiple ''lib'' tags are allowed. <div class="code panel" style="border-width: 1px"><div class="codeContent panelContent">  
+
* ''lib'' - specifies which libraries needs to be included for a particular web application (treated as files inside WEB-INF/lib folder). Multiple ''lib'' tags are allowed.  
 +
<source lang="xml">  
 
  <jetty ...>
 
  <jetty ...>
 
   <webapp ...>
 
   <webapp ...>
Line 174: Line 179:
 
   </webapp>
 
   </webapp>
 
  </jetty>
 
  </jetty>
</div></div><br class="atl-forced-newline" /><br class="atl-forced-newline" /><br class="atl-forced-newline" /><br class="atl-forced-newline" />
+
</source>
* ''classes'' - specifies which folder contains web application classes (treated as WEB-INF/classes folder). Multiple ''classes'' tags are allowed. <div class="code panel" style="border-width: 1px"><div class="codeContent panelContent">  
+
* ''classes'' - specifies which folder contains web application classes (treated as WEB-INF/classes folder). Multiple ''classes'' tags are allowed.  
 +
<source lang="xml">  
 
  <jetty ...>
 
  <jetty ...>
 
   <webapp ...>
 
   <webapp ...>
Line 181: Line 187:
 
   </webapp>
 
   </webapp>
 
  </jetty>
 
  </jetty>
</div></div><br class="atl-forced-newline" /><br class="atl-forced-newline" /><br class="atl-forced-newline" /><br class="atl-forced-newline" />
+
</source>
 
* ''connectors'' - specifies additional web application connectors
 
* ''connectors'' - specifies additional web application connectors

Revision as of 14:12, 21 September 2010



Introduction

A new plugin is available in the /extras/ant location, which 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.

For impatient folks, there is already a demo provided in jetty-contrib repository for the Ant Jetty plugin. It's good to compile Jetty before running these tests, because the demo depends on Jetty JARs from the Maven repository. Alternatively, you can download these JARs manually from one of the Maven repositories. Please see build.xml file in jetty-ant-demo folder for a list of required JARs.

Modifying build.xml from jetty-ant-demo is also the easiest way to start playing with this plugin.

Beginning to Use Ant

The Ant plugin depends on Jetty JARs, and so far it's necessary to build Jetty and then the Ant plugin directly from sources. Here's how it goes:

  1. Get the latest jetty sources from http://dist.codehaus.org/jetty/
  2. Unpack jetty and build it with 'mvn install' (If you don't have Maven yet, get it from http://maven.apache.org/)
  3. Go to the extras/ant/ folder and build ant plugin with 'mvn install'
  4. Go to <your M2 repo root>/repository/org/eclipse/jetty/jetty-ant and get the jetty-ant plugin JAR.
  5. Get these files to run Jetty with JSP/Servlets support (find these in <your M2 repo root>/repository/org/eclipse/jetty):
    • jetty.jar
    • jetty-util.jar
    • jetty-plus.jar
    • jetty-naming.jar
    • servlet-api-2.5.jar
    • jsp-api-2.1.jar
    • jsp-2.1.jar
    • and core-3.1.1.jar from <M2 repository>/org/eclipse/jdt/core/3.1.1/
  6. Put all the JARs inside one lib directory (let's say jetty-lib).

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, we 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>

Starting jetty on port 8080 is then a simple matter of executing ant jetty.run from the command line.

Deploying web applications

Adding web applications to the Jetty web server is now a simple matter of putting 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.

Plugin syntax

There are many ways to configure jetty task:

  • 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"/>
</div>
  • systemProperties - adds system properties when starting Jetty:
 
 <jetty ...>
   <systemProperties>
     <systemProperty name="jetty.status" value="Jetty Rocks!"/>
   </systemProperties>
 </jetty>
  • connectors - defines Jetty connectors (a better way still needs to be developed):
 
 <typedef name="selectChannelConnector" classname="org.mortbay.jetty.nio.SelectChannelConnector"
                            classpathref="jetty.plugin.classpath" loaderref="jetty.loader" />
 ...
 <jetty ...>
   <connectors>
     <selectChannelConnector port="8090" />
   </connectors>
 </jetty>
  • userRealms - adds authentication via user "realms":
> 
 <typedef name="jdbcRealm" classname="org.mortbay.jetty.security.HashUserRealm"
                  classpathref="jetty.plugin.classpath" loaderref="jetty.loader" />
 ...
 <jetty ...>
   <userRealms>
     <userRealm name="realm1" config="path/to/realm/config" />
   </userRealms>
 </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>
 
 <jetty ...>
   <webapp jettyEnvXml="/path/to/jettyEnv.xml" .../>
 </jetty>
</div></div><br class="atl-forced-newline" /><br class="atl-forced-newline" /><br class="atl-forced-newline" /><br class="atl-forced-newline" />
* ''webXml'' - path to web.xml file. If not specified, the default (location-of-war-file/WEB-INF/web.xml) location is used: <div class="code panel" style="border-width: 1px"><div class="codeContent panelContent"> 
 <jetty ...>
   <webapp webXmlFile="/path/to/web/xml" .../>
 </jetty>
</div>
* ''scanTargets'' and ''scanIntervalSeconds'' - used to point to a special files/folders which need to be scanned and specify scanner interval in seconds respectively. If any of files changes the web application is being automatically reloaded. Scan interval and scanned files can be adjusted per web application.<br />'''IMPORTANT'''<nowiki>: Please note, that all files included with <classes/> or <lib/> tags are </nowiki>'''automatically''' scanned for changes if you provide ''scanIntervalSeconds'' parameter in the <jetty/> tag. There's no need to add them using the <scanTargets/> section. 
<source lang="xml">
 <jetty ...>
   <webapp ... scanIntervalSeconds="5">
     <scanTargets dir="path/to/included/resources">
       <include name="filename/patterns" />
     </scanTargets>
   </webapp>
 </jetty>
  • lib - specifies which libraries needs to 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