2015-09-10 17 views
7

Mam problemy z korzystaniem z funkcji hotswap w wersji społecznościowej Intellij IDEA. Mój jest w 14.1.4.Hotswap/DCEVM nie działa w Intellij IDEA (wersja społecznościowa)

Za każdym razem, gdy uruchomiłem debugowanie i zmieniłem kod Java, kliknąłem już odbudować projekt i wcisnąć "Tak" przy potwierdzaniu klas ponownego ładowania. Intellij informuje, że zmienione klasy są przeładowywane, ale wynik aplikacji jest taki sam jak poprzednio. Po prostu próbuję najprostszej aplikacji Java (tj. Nie w scenariuszach takich jak Tomcat, aplet itp.) Z stuffami po prostu takimi jak System.out.println, konkatencje łańcuchowe itp. To, co zmieniłem podczas trybu debugowania, to po prostu kody body metod, ale nie podpis metody/Nazwa. Nie mogę tego dostać.

W Eclipse po prostu bezpośrednio zmienić kod i naciśnij Zapisz, a następnie po prostu działa.

Co poszło nie tak?

(Uwagi:

W rzeczywistości jestem próbuje użyć DCEVM co sprawia zmianę struktury możliwe (na przykład zmiana nazwy klasy, nazwa metody, dodać metody itp), myślałem, że to rozwiąże problem problemu Hotswap znaleziono w IntelliJ. nie trzeba dodawać, że nie działa.

w Eclipse, uda mi się za pomocą DCEVM i mogą zmieniać nazwy metod podczas debugowania.

i dalej próbować Hotswap-agent i nadal nie zrobił” t pracy, natknąłem się na artykuł mówiący, że IDE musi JDPA-połączyć się z JVM przez port 5000, ale nie ważne jak tri ED konsoli Intellij pokazuje, że jest on nadal łączenia thru losowej portu (51018 poniżej):

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

Połączony celu VM adres: '127.0.0.1:51018' transportu: 'gniazdo'

Czy możliwe jest wymuszenie połączenia przez jeden określony port? Dodanie zmiennej DEBUG_OPT środowiskową w Run/Debug Config nie działa)

Odpowiedz

7

okazało się, że jest to zachowanie IntelliJ poprzez zaprojektowaniu po znalezieniu jednego zwrotne od JetBrains do issue request:

Feedback of an issue request from Jetbrains

innymi słowy, problem jest związany z jak ja przetestować hotswapping:

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

    //*/ 
    public static void main(String[] args) { 
     System.out.println("Hello " + getName()); // <=== (1) 
    } 
} 
  1. Zgodnie z zachowaniem Intellijla "stary kod jest nadal używany do momentu, gdy maszyna wirtualna nie będzie już działać w przestarzałym stosie" (inne zachowanie w porównaniu do Eclipse), jeśli zmienisz "Cześć" na "Cześć" w punkcie (1), nowy kod nigdy nie zostanie wykonany - nowy kod może zostać ponownie uruchomiony tylko wtedy, gdy główny() zostanie wywołany drugi raz, co jest niemożliwe, ponieważ aplikacja jest już zakończona

  2. Jeśli to (2) uległo zmianie (powiedzmy , zastępując "James" w/"Sean") zamiast (1), w czasie, gdy kursor wykonawczy jest zatrzymywany przez punkt przerwania umieszczony w (1) (dlatego jeszcze nie wprowadzono do funkcji getName()), i ponownie załadujesz klasę, otrzymasz nowy kod uruchamiany (drukowanie "Sean")

DCEVM działało idealnie też, stosując ten sam sposób, aby przetestować hotswapping

Można również użyć „drop frame” w oknie śledzenia stosu, aby bieżący wykaz cofnąć do początku danej metody (z wyjątkiem głównej()) - w rzeczywistości jest to to samo zachowanie w Eclipse.

+0

Eclipse (o ile pamiętam) upuszcza potrzebne ramki, aby wydostać się z przestarzałego kodu. –