2012-04-24 9 views
6

Ich benutze dcevm + run-jetty-run + livereload, versuchen Sie eine Web-App zu entwickeln, ohne Jetty neu zu starten, wenn Sie Java-Quellen ändern.Wie kann der Anlegesteg die Anforderung blockieren, wenn geänderte Klassen neu geladen werden?

Alles funktioniert gut. Beim Ändern einer Java-Klasse hat Liveload die Änderung überwacht und den Browser veranlasst, geöffnete Seiten zu aktualisieren, um das geänderte Ergebnis zu sehen.

Aber ich fand es immer noch nicht so praktisch: Wenn der Browser neu lädt, haben dcevm und jetty diese modifizierten Klassen noch nicht neu geladen. Ich muss die Seite manuell erneut aktualisieren, aber ich bin mir nicht sicher, ob dieses Mal das modifizierte Ergebnis angezeigt wird, ohne den Inhalt sorgfältig zu überprüfen.

Also frage ich mich, gibt es eine Möglichkeit, Anlegestelle blockiert die Anfrage, wenn ich einige Klassen geändert und dcevm wird neu geladen. Dadurch wird sichergestellt, dass die angezeigten Seiten immer geändert werden.

Antwort

1

Es ist vielleicht zu hackig für Ihren Gaumen, aber Sie könnten ein statisches Initialisierungs-Snippet in Ihre Java-Quellen einfügen, um eine bekannte, separate Datei nach dem erneuten Laden zu aktualisieren. Als Liveload können Sie diese separate Datei ansehen, anstatt sie direkt auf .java Quellen arbeiten zu lassen.

Etwas entlang der Linien von:

public class ReloadUtils { 
    public static void notifyUpdate(String className) { 
    String baseDir = System.getProperty("DEV_MODE_BASEDIR") + "/"; 
    File file = new File(baseDir + className + ".updated"); 
    FileWriter fw = new FileWriter(file.getAbsoluteFile(), false); // overwrite instead of append 
    BufferedWriter bw = new BufferedWriter(fw); 
    bw.write(Long.toString(System.currentTimeMillis())); 
    bw.close(); 
    } 
} 

public class Reloadable { 

    private final static boolean DEV_MODE = System.getProperty("DEV_MODE").equals("true"); 

    static { 
    // static finals trigger most compilers to remove the statements in this case 
    if (DEV_MODE) { 
     ReloadUtils.notifyUpdate(Reloadable.class.getName()); 
    } 
    } 

    /* lots of useful stuff */ 
}