2015-01-16 15 views
7

Ich habe diesen Fehler erhalten, wenn ich versuche, die Klasse (hot swap) mit geänderten Methodenkörpern in meinem Projekt neu zu laden. Bevor alles gut geht, hört es plötzlich auf und ich erinnere mich an nichts, was eine Ursache sein könnte. Was ist seltsam, ich habe ein anderes Projekt mit der gleichen Einstellung und Hot-Swap für Methodenkörper funktioniert gut. HierIntellJ Idea tomcat Hot swap fehlgeschlagen: Schemaänderung nicht implementiert Vorgang wird von VM nicht unterstützt

ist Konfiguration für NOT-Arbeits Projekt:

enter image description here

enter image description here

Und meine VM-Einstellungen:

-XX:PermSize=512m 
-XX:MaxPermSize=1024m 
-Xms1024m 
-Xmx2048m 
-Dcatalina.home="C:\Programy\apache-tomcat-7.0.57" 
-Djava.endorsed.dirs="C:\Programy\apache-tomcat-7.0.57\endorsed" 
-javaagent:C:\Programy\apache-tomcat-7.0.57/lib/spring-instrument-3.1.2.RELEASE.jar 
-Dspring.profiles.active=closeMonthTest 
-Dnpk.jobs.enabled=true 

und hier ist Konfiguration für meine Arbeits Projekt:

enter image description here

enter image description here

VM Optionen:

-XX:PermSize=512m 
-XX:MaxPermSize=1024m 
-Xms1024m 
-Xmx2048m 
-Dcatalina.home="C:\Programy\apache-tomcat-7.0.57" 
-Djava.endorsed.dirs="C:\Programy\apache-tomcat-7.0.57\endorsed" 
-javaagent:C:\Programy\apache-tomcat-7.0.57/lib/spring-instrument-3.1.2.RELEASE.jar 
-Dspring.profiles.active=test 

Antwort

7

Es ist sehr schwierig, ohne Code die Ursache zu finden. Allerdings kann ich einen künstlichen Testfall schreiben, wo die Java-Compiler auch synthetische Methoden erstellen, wenn ich nur eine Methode Körper ändern:

public class Test { 

    static class Inner { 

     private void getPrivate(int i) { 
      Thread.dumpStack(); 
     } 

     private void getPrivate() { 
      Thread.dumpStack(); 
     } 
    } 

    public static void main(String[] args) { 
     Inner inner = new Inner(); 
     inner.getPrivate(0); 
     inner.getPrivate(); 
    } 
} 

Dieser Effekt wird durch ein Syntheseverfahren Zugang erklärt $ 000, die javac Zugang zu ermöglichen, erzeugt zu ein privates Mitglied der Inneren Klasse.

javac Test.java 
javap -c -private Test\$Inner 
... 
    static void access$000(edu.Test$Inner, int); 
    Code: 
     0: aload_0  
     1: iload_1  
     2: invokespecial #2     // Method getPrivate:(I)V 
     5: return   

    static void access$100(edu.Test$Inner); 
    Code: 
     0: aload_0  
     1: invokespecial #1     // Method getPrivate:()V 
     4: return   

Lassen Sie uns die Bestellung von zwei Verfahren in der Haupt ändern:

public static void main(String[] args) { 
     Inner inner = new Inner(); 
     inner.getPrivate(); 
     inner.getPrivate(0); 
    } 

Als Ergebnis der Compiler Methoden Signaturen geändert hat.

... 
    static void access$000(edu.Test$Inner); 
    Code: 
     0: aload_0  
     1: invokespecial #2     // Method getPrivate:()V 
     4: return   

    static void access$100(edu.Test$Inner, int); 
    Code: 
     0: aload_0  
     1: iload_1  
     2: invokespecial #1     // Method getPrivate:(I)V 
     5: return  

Von HotSwap Sicht wird diese Änderung verboten, weil Signatur der Methode access$000 geändert wurde.

+1

gute Antwort, danke – Regenschein