embedded jetty und das File-Locking-Problem unter Windows

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.

Flattr this!


wallpaper-1019588
Der Frühling kommt bunt!
wallpaper-1019588
Solarpaket 1 diese Woche im Bundestag: Wichtige Änderungen für Balkonkraftwerke
wallpaper-1019588
Omega ≠ Idol: Boys-Love-Werk kommt bei Panini heraus
wallpaper-1019588
Spice and Wolf: Deutscher Simuldub bei Crunchyroll gestartet