2015-09-10 8 views
7

У меня возникли проблемы с использованием функции hotswap в версии сообщества Intellij IDEA. Шахта - 14.1.4.Hotswap/DCEVM не работает в Intellij IDEA (версия сообщества)

Каждый раз, после того как я отпустил отладку и изменил код Java, я уже нажимаю проект перестроения и нажимаю «Да» на подтверждение классов перезагрузки. Intellij сообщает, что измененные классы перезагружаются, но результат приложения такой же, как и раньше. Я просто пытаюсь простейшее приложение Java (т. Е. Не в сценариях, таких как Tomcat, applet и т. Д.), С файлами, такими как System.out.println, строковыми контамитами и т. Д. То, что я изменил во время режима отладки, это просто коды тела метода, но не подпись метода/имя. Я не могу это получить.

В Eclipse я просто напрямую меняю код и нажимаю save, а затем он просто работает.

Что пошло не так?

(примечание:

На самом деле я пытаюсь использовать DCEVM, что делает изменение структуры возможное (например, имя класса изменения, имя метода, добавить методы и т.д.), считало, что это позволит решить проблему проблемы горячей замены найдено в Intellij. Излишне говорить, что это не сработало.

в затмении, мне удастся с помощью DCEVM и может изменить имена методов во время отладки.

Я также попробовать HotSwap-агент, и он до сих пор Ждут» я столкнулся с статьей, в которой говорится, что среда IDE должна подключаться к JVM через порт 5000, но независимо от того, как я tri е изд, Intellij консоль показывает, что она по-прежнему подключения через произвольный порт (51018 ниже):

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

подключен к целевому VM, адрес: «127.0.0.1:51018», транспорт: «гнездо»

Можно ли подключить его через один конкретный порт? Добавление переменной DEBUG_OPT среды в Run/Debug Config не работает)

ответ

7

Найдено, что это по-дизайн поведение IntelliJ после того, как найти одну обратную связь от JetBrains к issue request:

Feedback of an issue request from Jetbrains

другими словами, проблема связана с тем, как я проверить на hotswapping:

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

    //*/ 
    public static void main(String[] args) { 
     System.out.println("Hello " + getName()); // <=== (1) 
    } 
} 
  1. Поведение Intellij заключается в том, что «старый код все еще используется до тех пор, пока VM не выйдет из устаревшего фрейма стека» (другое поведение по сравнению с Eclipse), если вы измените «Hello» на «Bye» в (1), новый код никогда не будет выполнен - ​​новый код может быть выполнен снова только тогда, когда main() вызывается во второй раз, что невозможно, так как приложение уже завершено

  2. Если это (2), это изменение (скажем, , заменяя «James» w/«Sean») вместо (1), во время остановки курсора выполнения точкой останова, помещенной в (1) (поэтому еще не вступили в getName()), и вы перезагружаете класс, вы будете запускать новый код (печать «Шон»)

DCEVM работал отлично тоже, используя тот же способ проверить hotswapping

Вы можете также использовать «падение кадр» в окне трассировки стека, чтобы сделать текущее заявление откат к началу метода (кроме главной()) - на самом деле это то же поведение в Eclipse.

+0

Eclipse (насколько я помню) отбрасывает необходимые кадры, чтобы выбраться из устаревшего кода. –