2015-09-10 10 views
7

Ho problemi nell'utilizzare la funzione hotswap nella versione comunità IDEA Intellij. Il mio è v 14.1.4.Hotswap/DCEVM non funziona in Intellij IDEA (Versione comunità)

Ogni volta che ho disattivato il debug e modificato il codice java, ho già fatto clic su Ricostruisci progetto e premere "Sì" per confermare le classi di ricarica. Intellij riporta che le classi modificate vengono ricaricate, ma il risultato dell'applicazione è lo stesso di prima. Sto solo provando la più semplice applicazione Java (cioè non in scenari come Tomcat, applet, ecc.) Con cose come System.out.println, concat di stringhe, ecc. Quello che ho modificato durante la modalità di debug è solo i codici corpo del metodo, ma non la firma del metodo/nome. Non riesco a capirlo.

In Eclipse ho appena modificato il codice e premuto save, quindi funziona.

Cosa non ha funzionato?

(Nota:

In realtà sto cercando di utilizzare DCEVM che rende cambiamento della struttura possibile (ad esempio cambio di nome della classe, nome del metodo, aggiungere metodi, ecc), pensarono che avrebbe risolto il problema del problema hotswap si trovano in IntelliJ. Inutile dire che non ha funzionato.

in Eclipse, riesco a utilizzare DCEVM e può cambiare i nomi dei metodi durante il debug.

provo ulteriormente hotswap-agent e ancora didn' lavoro, mi sono imbattuto in un articolo che diceva che l'IDE deve connettersi con JDPA alla JVM attraverso la porta 5000, ma non importa quanto io sia ed, console Intellij mostra che è ancora connette tramite una porta casuale (51018 sotto):

"C:\Program Files\Java\jdk1.8.0_60\bin\java" -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:51018...." 

collegamento VM target, indirizzo: '127.0.0.1:51018', trasporto: 'presa'

È possibile forzarlo per connettersi attraverso una porta specifica? aggiunta la variabile DEBUG_OPT ambiente nel Run/Debug Config non funziona)

risposta

7

scoperto che è il comportamento di Intellij da-design dopo aver trovato un feedback da JetBrains a un issue request:

Feedback of an issue request from Jetbrains

in altre parole, il problema è legato al modo in cui ho testare la hotswapping:

public class Main { 
// /* 
    public static String getName() { 
     return "James"; // <=== (2) 
    } 

    //*/ 
    public static void main(String[] args) { 
     System.out.println("Hello " + getName()); // <=== (1) 
    } 
} 
  1. Come il comportamento di Intellij è che "il vecchio codice è ancora utilizzato fino a quando la VM esce dal frame stack obsoleto" (un comportamento diverso rispetto a Eclipse), se si modifica "Ciao" su "Ciao" a (1), il nuovo codice non verrà mai eseguito - il nuovo codice può essere eseguito nuovamente solo quando main() viene chiamato la seconda volta, il che è impossibile in quanto l'applicazione è già terminata

  2. Se è (2) che viene modificato (ad esempio , sostituendo "James" con "Sean") anziché (1), durante il momento in cui il cursore di esecuzione viene arrestato da un punto di interruzione posizionato su (1) (pertanto non è stato immesso ancora su getName()), e ricarichi la classe, otterrai il nuovo codice in esecuzione (stampa "Sean")

DCEVM ha funzionato perfettamente anche, utilizzando allo stesso modo per testare la hotswapping

È inoltre possibile utilizzare "drop frame" nella finestra di analisi dello stack per rendere l'attuale rullo dichiarazione di nuovo all'inizio del metodo (eccetto principale()) - in effetti è lo stesso comportamento in Eclipse.

+0

Eclipse (per quanto mi ricordo) rilascia i frame necessari per uscire dal codice obsoleto. –