...
Jetty buffers static content for webapps such as html files, css files, images etc and uses memory mapped files to do this if the NIO connectors are being used. The problem is that on Windows, memory mapping a file causes the file to be locked, so that the file cannot be updated or replaced. See Sun bug: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4715154. This means that effectively you have to stop Jetty in order to update a file.
...
The default webdefault.xml file is found in the lib/jetty.jar at org/mortbay/jetty/webapp/webdefault.xml. Extract it to a convenient disk location and edit it to change useFileMappedBuffer to false:
| Code Block | ||
|---|---|---|
| ||
<init-param>
<param-name>useFileMappedBuffer</param-name>
<param-value>true</param-value> <!-- change to false -->
</init-param>
|
Then, ensure that your custom webdefault.xml file is applied to all of your webapps. You can do that by changing the configuration of the WebAppDeployer in etc/jetty.xml:
| Code Block | ||
|---|---|---|
| ||
<Call name="addLifeCycle">
<Arg>
<New class="org.mortbay.jetty.deployer.WebAppDeployer">
<Set name="contexts"><Ref id="Contexts"/></Set>
<Set name="webAppDir"><SystemProperty name="jetty.home" default="."/>/webapps</Set>
<Set name="parentLoaderPriority">false</Set>
<Set name="extract">true</Set>
<Set name="allowDuplicates">false</Set>
<Set name="defaultsDescriptor">/home/fred/jetty/mywebdefaults.xml</Set> <!-- set to your customized defaults file -->
</New>
</Arg>
</Call>
|
Alternatively, if you have individually configured your webapps with context xml files, you need to call the WebAppContext.setDefaultsDescriptor(String path) method:
| Code Block | ||
|---|---|---|
| ||
<New id="myWebAppContext" class="org.mortbay.jetty.webapp.WebAppContext">
<Set name="contextPath">/</Set>
<Set name="war">./webapps/fredapp</Set>
<Set name="defaultsDescriptor">/home/fred/jetty/mywebdefaults.xml</Set>
.
.
</New>
|
...
A WebAppContext can be forced to always copy a web app directory on deployment to avoid the file locking issue.
This can be set in a context deployment file as follows:
| Code Block | ||
|---|---|---|
| ||
<New id="myWebAppContext" class="org.mortbay.jetty.webapp.WebAppContext">
<Set name="contextPath">/</Set>
<Set name="war">./webapps/fredapp</Set>
<Set name="copyWebDir">true</Set>
.
.
</New>
|
It seems one can also configure the default jetty Servlet directly in the web.xml. For example:
| Code Block | ||
|---|---|---|
| ||
<web-app ...>
...
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.mortbay.jetty.servlet.DefaultServlet</servlet-class>
<init-param>
<param-name>useFileMappedBuffer</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
...
</web-app>
|
...