2011-11-29 3 views
8

Tôi đã viết một số chương trình thực hành cho chứng nhận java của tôi sáng nay, và nhận thấy rằng tôi đã gõ nhầm tên gói, vì vậy nó không khớp với thư mục con tệp java. Tôi biên dịch mã mong đợi một lỗi, nhưng mọi thứ đã biên dịch tập tin - thậm chí không phải là cảnh báo.Không gói phải phù hợp với các thư mục con các tập tin java là trong?

Tôi googled xung quanh một chút, và hầu hết các trang tôi đọc nói rằng tên gói phải phù hợp với thư mục con. Kinh nghiệm của tôi cho thấy đó không phải là trường hợp.

Khi tôi cố gắng chạy chương trình, nó không hoạt động vì tệp .class nằm trong thư mục sai. Tôi chuyển nó vào thư mục chính xác, và đã nhận lỗi này:

Exception in thread "main" java.lang.NoClassDefFoundError: com/sample/directory 
/doesnt/even/exist/OtherPackageMemberModifiers (wrong name: com/sample/chap01/O 
therPackageMemberModifiers) 

Vì vậy, những gì tôi nghĩ tôi nhìn thấy là mã Java sẽ biên dịch nếu gói và các thư mục con không trùng khớp nhau nhưng có dường như không phải là cách để chạy mã nếu bạn làm điều đó. Đúng không?

+3

Hiện tượng rằng con đường gói và đường dẫn thư mục là dư thừa cho thấy cái đầu khó chịu của nó. Trình biên dịch sẽ có quyền phát hành một lỗi. Tuy nhiên, đó sẽ không phải là 100%: gói src.main.java.com.sample ... hoặc gói com.sample. ... vẫn sẽ không có lỗi. Javac sẽ cần phải được dựa trên thư mục (-d) và nó là cơ bản dựa trên tập tin. –

Trả lời

14

Tên gói phải khớp với tên thư mục để tệp lớp được tìm thấy chính xác. Nó không để khớp với tên thư mục tại thời gian biên dịch cho một số trình biên dịch (ví dụ: javac) mặc dù các trình biên dịch khác (chẳng hạn như Eclipse) sẽ ít nhất đưa ra cảnh báo.

Cách "chạy mã nếu bạn làm điều đó" là tạo cấu trúc thư mục và đặt cấu trúc đó theo cách thủ công - bản thân tệp lớp hoàn toàn hợp lệ.

Lưu ý rằng nếu bạn sử dụng cờ -d, javac sẽ xây dựng hệ thống phân cấp thư mục thích hợp cho bạn, bất kể vị trí nguồn. Ví dụ:

javac -d bin ClassInPackage.java 

sẽ tạo ra bất kỳ thư mục theo yêu cầu của bin để phù hợp với gói khai báo trong ClassInPackage.java.

Có nói tất cả các thise, tôi vẫn mạnh mẽ khuyến khích bạn thực hiện các thư mục nguồn phù hợp với các gói, mặc dù bạn có thể lấy đi mà không có nó :)