tomcat - reload-Klassen dynamisch
Ich habe einen Ordner mit vielen .class-Dateien. Diese Klassen sind aktualisiert 'app 1'. Und es ist 'app 2', lädt diese Klassen dinamically.
Ist das problem....
'app 2' verwendet eine Klasse-Datei, 'app 1' update-Datei, dann 'app 2' muss wieder die Klasse, aber es seemes zu halten und zu verwenden, eine Kopie der älteren Klasse.
so, ich habe die Ordner und die Klasse erfolgreich aktualisiert wurde, habe ich versucht neu zu laden 'app 2', aber es hält auch mit der alten Klasse.
Nur, wenn ich starten Sie tomcat neu, 'app 2' liest die neue Klasse.
Warum ist das so?
Ich darf neu laden 'app 2' aber, in der Produktion Umwelt, ich kann nicht starten Sie tomcat neu.
Seinen sehr wichtig in meinem job, ich freue mich über jede Idee.....
Ich bin mit einer "sauberen" installation von tomcat6 und ich laden Sie die class-Dateien mit:
Class.forName(<classname>).newInstance()
thx a lot
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, dass die Laufzeit bereits geladen, die alte classfile in den classloader verwendet wird, indem Sie den code verwenden möchte, die modifizierte Klasse. Man müsste einen Weg finden, wie der classloader zur Aktualisierung seiner Klasse Inhalte von der Festplatte, um das zu erreichen, was Sie wollen. Dies ist der Grund, warum Klasse.forName() nicht funktioniert : es ist der Zugriff auf die bereits geladen (und zwischengespeichert) version der Klasse. Alex R hat Recht, sollte man versuchen neu zu strukturieren Sie Ihren code, um Ihre separate Klassen für diese beiden Projekte. Aber, wenn du tot bist Satz auf den Versuch neu zu laden, die Klasse und halten Sie Dinge, die Sie, wie Sie sind, können Sie versuchen, das Experimentieren mit Classloader.defineClass() und laden Sie die neue version der Klasse aus .class-Datei in ein byte[], dann übergeben byte [], um den Classloader.defineClass(). Sie werden wahrscheinlich wollen, verwenden Sie die Kontext-classloader assoziiert mit der Anwendung von Tomcat (eher als die top-level-Tomcat-classloader). Es gibt Unterlagen die Unterscheidung zwischen den beiden in der Tomcat-Dokumentation zum Projekt.
Default-Verhalten ist, dass Klassen zwischengespeichert werden durch die
ClassLoader
laden Sie. Wenn Sie das tun:Class.forName('MyClass')
zwei mal in Folge, werden Sie nur die Klasse laden, das erste mal.Neu zu laden, eine Klasse, die Sie nicht nur brauchen, um alle Referenz, die Sie bereits haben, um jede Instanz dieser Klasse, aber auch jede Referenz, die Sie haben, um die
ClassLoader
dass es geladen. Nur dann können Sie sicher sein, dass die ganze Klasse kann eine garbage Collection ausgeführt werden (oder Sie werden am Ende mit memory leaks - ein Dauerproblem in Neuladen webapps).Du kann werden können, erstreckt sich
ClassLoader
Sie und ändern Sie die caching-Verhalten.Sind Sie richtig!
Dies ist eine tolle Erklärung mit einem Beispiel über Alexs Idee
Ich denke, man sollte versuchen, separate Klassen für diese 2 Anwendungen. Versuchen Sie es zuerst erstellen Sie 2 identische Verzeichnisse. Eine für app1, die zweite für app2. Wenn dies Ihr problem löst, packen Sie Ihre Klassen in jar und halten nur 2 doppelte jar-Dateien. Ich denke, dass das problem nicht in java, sondern im Dateisystem. Ich glaube, dass Sie mit windows. Wenn also vermutlich versuchen, das zu tun, was Sie jetzt machen, in linux (es sei denn, es ist irrelevant für Ihr Unternehmen).