2015-09-10 12 views
7

Tôi gặp khó khăn khi sử dụng chức năng hotswap trong Phiên bản Cộng đồng Intellij IDEA. Mỏ là v 14.1.4.Hotswap/DCEVM không hoạt động trong Intellij IDEA (Phiên bản Cộng đồng)

Mỗi lần sau khi tôi tắt gỡ lỗi và thay đổi mã java, tôi đã nhấp vào xây dựng lại dự án và nhấn "Có" khi xác nhận các lớp tải lại. Intellij báo cáo rằng các lớp đã thay đổi được tải lại, nhưng kết quả ứng dụng cũng giống như trước đây. Tôi chỉ đang thử ứng dụng Java đơn giản nhất (ví dụ: không có trong các kịch bản như Tomcat, applet, v.v.) với các nội dung đơn giản như System.out.println, chuỗi concats v.v. Những gì tôi đã thay đổi trong chế độ gỡ lỗi chỉ là mã cơ thể của phương thức chứ không phải chữ ký phương thức/Tên. Tôi không hiểu được.

Trong Eclipse tôi chỉ trực tiếp thay đổi mã và nhấn lưu, sau đó nó chỉ hoạt động.

Điều gì đã xảy ra?

(Ghi chú:

Trong thực tế, tôi đang cố gắng sử dụng DCEVM mà làm thay đổi cấu trúc có thể (ví dụ như tên lớp thay đổi, tên phương pháp, thêm các phương pháp vv), nghĩ rằng nó sẽ giải quyết vấn đề của vấn đề hotswap tìm thấy trong Intellij. không cần phải nói, nó đã không làm việc.

trong nhật thực, tôi thành công trong việc sử dụng DCEVM và có thể thay đổi tên phương pháp trong gỡ lỗi.

tôi cũng thử hotswap-agent và nó vẫn didn' Tôi đã đi qua một bài báo nói rằng IDE phải JDPA-kết nối với JVM qua cổng 5000, nhưng không có vấn đề làm thế nào tôi tri ed, Intellij console cho thấy rằng nó vẫn đang kết nối thông qua một cổng ngẫu nhiên (51.018 dưới đây):

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

kết nối vào máy chủ đích, địa chỉ: '127.0.0.1:51018', giao thông: 'ổ cắm'

Có thể buộc nó kết nối qua một cổng cụ thể không? Thêm biến DEBUG_OPT môi trường trong Run/Debug Config không hoạt động)

Trả lời

7

Tìm thấy ra rằng đó là hành vi của thiết kế Intellij của sau khi tìm thấy một thông tin phản hồi từ Jetbrains một issue request:

Feedback of an issue request from Jetbrains

Nói cách khác, vấn đề liên quan đến cách tôi thử nghiệm tính năng hotswapping:

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

    //*/ 
    public static void main(String[] args) { 
     System.out.println("Hello " + getName()); // <=== (1) 
    } 
} 
  1. Vì hành vi của Intellij là "mã cũ vẫn được sử dụng cho đến khi VM thoát khỏi khung ngăn xếp lỗi thời" (một hành vi khác so với Eclipse), nếu bạn thay đổi "Hello" thành "Bye" tại (1), mã mới sẽ không bao giờ được thực thi - mã mới có thể được thực hiện lại chỉ khi hàm main() được gọi là lần thứ hai, điều này là không thể khi ứng dụng bị chấm dứt là

  2. Nếu đó là (2) thay đổi (nói , thay thế "James" w/"Sean") thay vì (1), trong thời gian con trỏ thực hiện bị dừng bởi điểm dừng được đặt tại (1) (do đó chưa nhập vào getName()), và bạn tải lại lớp, bạn sẽ nhận được mã mới đang chạy (in "Sean")

DCEVM làm việc một cách hoàn hảo quá, bằng cách sử dụng cùng một cách để kiểm tra hotswapping

Bạn cũng có thể sử dụng "thả khung" trong cửa sổ stack trace để làm cho cuộn tuyên bố hiện tại trở về đầu của phương pháp (trừ chính()) - trên thực tế nó là hành vi tương tự trong Eclipse.

+0

Eclipse (theo như tôi nhớ) sẽ giảm các khung cần thiết để thoát khỏi mã lỗi thời. –

Các vấn đề liên quan