2011-12-23 40 views
38

Trong C#, chúng tôi có 2 chế độ để xây dựng các dự án: DebugRelease, tôi tự hỏi nếu Java có cùng một điều. Tôi đang sử dụng IntelliJ IDEA như Java IDE và cho đến nay tôi đã không nhìn thấy bất cứ nơi nào để cấu hình một chế độ xây dựng như trong VS IDE.Java có chế độ xây dựng 'Gỡ lỗi' và 'Phát hành' như C# không?

+0

bạn đã tìm kiếm trên web một cái gì đó như ** java bằng cách sử dụng khẳng định **? đối với IDEA, nếu bạn nhìn vào /bin/idea.exe.vmoptions, bạn có thể sẽ thấy rằng nó chạy trong chế độ 'Debug' - nếu có cài đặt' -ea' hiện tại :) – gnat

+0

@gnat, vâng, có '-ea' thiết lập trong' idea.exe.vmoptions'.Nhưng làm thế nào về khi nó xây dựng một tạo phẩm (một tệp jar), vẫn còn trong chế độ "Debug' với một tạo phẩm? – JatSing

+1

trong tệp vmoptions, '-ea' tác động đến cách IDEA chạy (đó là ứng dụng java bạn biết không?) ** không ** mã mà nó tạo. Đối với các lọ, bạn quản lý chế độ của chúng trong thời gian chạy bằng cách chỉ định hoặc bỏ qua '-ea'. Như tôi đã viết, chỉ cần tìm kiếm web cho java khẳng định có rất nhiều hướng dẫn trên rằng – gnat

Trả lời

32
javac 
    -g       Generate all debugging info 
    -g:none     Generate no debugging info 
    -g:{lines,vars,source}  Generate only some debugging info 

Bạn có thể chọn bao gồm các biểu tượng gỡ lỗi trong các lớp được biên dịch (đây là mặc định) hoặc không làm như vậy. Không có nhiều lợi ích khi không làm điều đó. Các tệp jar sẽ là a little smaller, nhưng lợi ích hiệu suất là tối thiểu (nếu có). Nếu không có các ký hiệu này, bạn sẽ không còn nhận được số dòng trong các dấu vết ngăn xếp nữa. Bạn cũng có tùy chọn để bao gồm additional symbols with local variable names (theo mặc định chỉ có tên tệp nguồn và số dòng).

java 
    -ea[:<packagename>...|:<classname>] 
    -enableassertions[:<packagename>...|:<classname>] 
        enable assertions 

Bạn cũng có thể bật xác nhận tại thời gian chạy (mặc định là tắt), đôi khi hữu ích trong quá trình phát triển và thử nghiệm. Điều này có tác động hiệu suất (nếu mã được đề cập đã thực sự sử dụng các xác nhận, mà tôi nghĩ là uncommon).

Bất kể bất kỳ cài đặt nào trong số các cài đặt này, JVM luôn cho phép bạn đính kèm trình gỡ lỗi.

Java nào không có trình biên dịch có điều kiện trong đó mã hoàn toàn khác nhau sẽ được biên dịch dựa trên một số cài đặt bên ngoài. Gần nhất bạn có thể nhận được là một cái gì đó giống như public static final boolean DEBUG_BUILD = true; một nơi nào đó trong mã của bạn và sử dụng trong các câu lệnh if. Điều này thực sự sẽ làm cho trình biên dịch loại trừ mã không thể truy cập được, nhưng bạn phải thiết lập hằng số này trong mã nguồn.

+1

anyway để làm cho 'public static cuối cùng boolean DEBUG_BUILD' vào preprocess, một cái gì đó như' # ifdebug' trong C#? – JatSing

+3

@JatSing: Không trực tiếp. Bạn có thể có một số loại kịch bản cập nhật giá trị trước khi bạn bắt đầu trình biên dịch. Hoặc có thể có một Constants.java và hai phiên bản của nó, và thiết lập classpath biên dịch cho một trong số chúng. Nhưng không có gì trong chuỗi công cụ chính thức. – Thilo

4

Bạn đang yêu cầu các loại bản dựng khác nhau để biên dịch theo những thứ khác nhau mà tôi đoán. Ví dụ để có Debug.WriteLine và Console.WriteLine.

"Không, Java không khớp chính xác với chức năng đó. Bạn có thể sử dụng các khía cạnh hoặc sử dụng vùng chứa IOC để chèn các lớp triển khai khác nhau." lấy trộm này từ những câu dưới đây: Conditional Java compilation

(đang có câu trả lời tuyệt vời khác cho bạn đó)

13

Đó là thực tế bình thường trong Java để giải phóng tất cả mọi thứ là một cách mà có thể được sửa lỗi. Đối với một số dự án yêu cầu obfuscation, họ có thể có một bản phát hành, nhưng tôi chưa bao giờ thấy điều này trong 12 năm phát triển Java.

Những thứ như xác nhận và thông báo gỡ lỗi thường bị tắt trong thời gian chạy cho phiên bản sản xuất nhưng có thể được bật bất cứ lúc nào (thậm chí động) nếu được yêu cầu.

IMHO là cách tốt nhất để sử dụng cùng một bản dựng trong mọi môi trường, không chỉ cùng một nguồn nhưng cùng một JAR. Điều này mang lại cho bạn cơ hội tốt nhất, nếu nó hoạt động trong thử nghiệm, nó sẽ hoạt động trong sản xuất và nếu bạn có vấn đề trong sản xuất, bạn có thể tái sản xuất nó trong thử nghiệm.

Vì có quá nhiều mã Java được viết theo cách này, JIT rất giỏi tối ưu hóa mã chết mà không bao giờ được gọi. Vì vậy, nhiều như vậy mà IMHO hầu hết các "tiêu chuẩn" vi mô nơi Java ra thực hiện C + +, là khi điểm chuẩn không làm bất cứ điều gì và JIT là tốt hơn tại phát hiện này. IMHO, C++ giả định rằng nhà phát triển đủ thông minh để không viết mã mà không làm bất cứ điều gì.

+1

"Tôi chưa bao giờ thấy điều này trong 12 năm phát triển Java". Với tôi, đó là phần liên quan nhất của câu trả lời của bạn, khi bạn đang viết Java cho HFT (!). Điều đó có nghĩa là việc biên dịch mã Java để bao gồm tất cả thông tin gỡ lỗi có/không/can thiệp với JIT JVM không? Tôi giả sử có, nhưng tìm kiếm xác nhận. – kevinarpe

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