2015-01-16 32 views
7

Ho ricevuto questo errore quando provo a ricaricare la classe (hot swap) con i corpi dei metodi modificati nel mio progetto. Prima che tutto funzioni bene, ma all'improvviso si ferma e non ricordo nulla di ciò che potrebbe essere una causa. Che strano c'è un altro progetto con la stessa impostazione e hot swap per i corpi del metodo funziona bene.IntellJ Idea tomcat Hot swap non riuscito: modifica dello schema non implementata Operazione non supportata da VM

Ecco configurazione per NON-lavorando progetto:

enter image description here

enter image description here

E le mie impostazioni VM:

-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 

e qui è la configurazione per il mio lavorare progetto:

enter image description here

enter image description here

opzioni VM:

-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 

risposta

7

E 'molto difficile trovare la causa principale senza codice. Tuttavia, posso scrivere un banco di prova artificiale in cui il compilatore Java creerà metodi di sintesi, anche se mi limito a cambiare un corpo del metodo:

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(); 
    } 
} 

Questo effetto si spiega con un sintetico accesso metodo $ 000, che javac genera per consentire l'accesso ai un membro privato della classe Inner.

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   

Cambiamo l'ordine dei due metodi nella principale:

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

Di conseguenza, il compilatore è cambiato metodi di firme.

... 
    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  

Dal punto di vista HotSwap questo cambiamento è vietata a causa del metodo di firma access$000 è stato cambiato.

+1

buona risposta, grazie – Regenschein