Thomas' IT-Blog

Ein Blog zu Java, Linux und OpenSource

jetty-logo-80x22

embedded jetty und das File-Locking-Problem unter Windows

| Keine Kommentare

Beim Entwickeln von Web-Applikationen benutze ich meistens einen embedded jetty zum Starten/Testen meiner Applikation aus der Entwicklungsumgebung (eclipse) heraus.

Wenn dann die Applikation läuft, möchte ich manchmal etwas ändern wie eine Eigenschaft in einer CSS-Datei oder so. Doch wenn ich die CSS-Datei mit eclipse editiere und dann speichern möchte, kommt folgende Fehlermeldung:

2015-03-22 21_56_51-Save Problems

Das Problem ist, dass Windows die Datei nicht mehr überschreiben kann / möchte, sobald diese im jetty cache ist. :( Da ich das Verhalten von Windows hier nicht ändern kann, und eine Verwendung von anderen Betriebssystemen nicht immer möglich ist, muss der jetty-cache deaktiviert werden, um das Problem zu lösen.

Dieses kann mit folgendem Eintrag in der web.xml erreicht werden:

1
2
3
4
5
6
7
8
9
<servlet>
  <servlet-name>Default</servlet-name>
  <servlet-class>org.eclipse.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>
<servlet>
  <servlet-name>Default</servlet-name>
  <servlet-class>org.eclipse.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>

Dabei betrifft eine Änderung an der web.xml aber auch immer andere Umgebungen (wie die Produktion) und kommt somit für mich hier nicht in Frage.

Daher habe ich stattdessen einfach meine WebStart.class (mit der die Applikation im embbded jetty gestartet wird) entsprechend angepasst:

1
2
3
4
5
6789
10
11
12
Server server = new Server(8088);
WebAppContext webapp = new WebAppContext();
webapp.setContextPath("/");
webapp.setWar(webroot);
 
ServletHolder defaultServletHolder = new ServletHolder(new DefaultServlet());defaultServletHolder.setInitParameter("useFileMappedBuffer", "false");webapp.addServlet(defaultServletHolder, "/*"); 
server.setHandler(webapp);
server.start();
server.join();
Server server = new Server(8088);
WebAppContext webapp = new WebAppContext();
webapp.setContextPath("/");
webapp.setWar(webroot);

ServletHolder defaultServletHolder = new ServletHolder(new DefaultServlet());
defaultServletHolder.setInitParameter("useFileMappedBuffer", "false");
webapp.addServlet(defaultServletHolder, "/*");

server.setHandler(webapp);
server.start();
server.join();

Der entscheidende Teil ist dabei der oben markierte, der genau dem zuvor gezeigten Eintrag in der web.xml entspricht, aber dieses Mal eben nur im Kontext des embedded jettys.

Und damit kann ich nun auch unter Windows CSS- oder HTML-Dateien ändern während der jetty läuft. :)

Autor: Thomas

Hallo, mein Name ist Thomas Kuhlmann. Ich schreibe hier über Java, Linux, OpenSource und manchmal auch über ganz andere Dinge. Solltest Du Fragen, Ideen oder Wünsche haben, würde ich mich freuen, wenn Du mir einen Kommentar hinterlässt oder eine Nachricht schickst.

Hinterlasse eine Antwort

Pflichtfelder sind mit * markiert.