2013-08-02 40 views
5

Cấu trúc thư mục của tôi trông giống như thế này.JVM không thể tìm thấy lớp của tôi: java.lang.NoClassDefFoundError

PackagesUnit3/com/myname/start/PackagesTest.java
(lớp này chứa chính và báo cáo kết quả nhập khẩu "nhập khẩu com.systems.mui của tôi. *;)

PackagesUnit3/com/hệ thống /mui/Test.java
(lớp này chứa các câu lệnh package "gói com.systems.mui;")

với PackageUnit3 như thư mục cơ sở của tôi, tôi có thể biên dịch thành công cả hai lớp với tuyên bố

"javac com/myname/start/PackagesTest.java" 

Tuy nhiên tôi không thể chạy mã với lệnh

"java com.myname.start.PackagesTest" 

Error: "Exception in thread "main" java.lang.NoClassDefFoundError: com/myname/start/PackagesTest (wrong name: PackagesTest)" 

Các trình biên dịch tạo thành công .class file cho mỗi lớp học java và đặt chúng trong cùng một vị trí như các tập tin nguồn.

Theo Horstmann, "Java lõi" phiên bản thứ 9. p. 186, Cú pháp lệnh "java" của tôi phải hoạt động.

Tôi không cần phải chỉ định thư mục hiện tại (".") Vì tôi không sử dụng tùy chọn classpath (-cp).

Một lưu ý: Tôi đã sử dụng lệnh "SUBST R:" để thiết lập thư mục PackagesUnit3 làm thư mục cơ sở. Dòng lệnh thực tế của tôi trông giống như R:>

Bất kỳ đề xuất nào ??

+2

+1 vì tiêu đề câu hỏi của bạn làm tôi cười. :) –

+2

'java com.myname.start.Packages.test' - đó có phải là lỗi đánh máy không? Vì tên lớp của bạn là 'PackagesTest'. –

+0

Tôi đề nghị bạn sửa dòng lệnh của mình. Nếu lớp PackageTest của bạn có phương thức main(), dòng lệnh của bạn phải là java com.myname.start.PackagesTest. – Olaf

Trả lời

10

Với ngoại lệ, có vẻ như bạn đang bỏ lỡ một tuyên bố package:

package com.myname.start; 

khai gói của bạn phải phù hợp với cấu trúc thư mục của bạn, và sau đó các lớp học sẽ được tạo ra với tên đầy đủ chính xác com.myname.start.PackageTest.

Hoặc biên dịch trong một IDE sắp xếp mọi thứ cho bạn hoặc biên dịch từ gốc của cấu trúc gói với đối số tùy chọn -d để chỉ định thư mục kết quả gốc, ví dụ:

$ javac -d bin com/myname/start/*.java 
$ java -cp bin com.myname.start.PackageTest 
+0

Tôi luôn luôn làm việc từ một IDE, vì vậy tôi không phải là một chuyên gia, nhưng sẽ không phải đặt ra được bằng cách nào đó? –

+1

@EdwardFalk: Không - bạn luôn có thể sử dụng '-cp' hoặc' --classpath', nhưng mặc định là sử dụng thư mục hiện tại. –

+0

Jon - bạn hoàn toàn chính xác - Tôi không đặt câu lệnh gói mà bạn đã chỉ ra trong tệp nguồn PackagesTest. Nó bây giờ chạy mà không có lỗi thời gian chạy. T.J. admonition đã đúng. –

0

Tôi đã kiểm tra về vấn đề này, tái hiện kịch bản và bạn nói đúng ... Giả sử tất cả các lớp học là công khai, với tờ khai gói đúng, và biên soạn từ thư mục gốc, lớp Test sẽ biên dịch thành công vì nó không tham chiếu bất kỳ lớp nào khác (hoặc các lớp từ các gói khác nhau). Không cần -cp tùy chọn

Khi biên dịch lớp PackagesTest, không tìm thấy lớp Test. Nhưng bằng cách thêm -cp ., nó biên dịch thành công.

Sau khi cả hai tệp được biên soạn, cố gắng chạy PackagesTest 'chính, cũng sẽ không tìm thấy lớp Test. Nhưng bằng cách thêm -cp , nó chạy trơn tru.

Bằng cách sử dụng tùy chọn -verbose bạn có thể thấy lệnh javac (và java) đang tìm kiếm ở đâu vì nó hiển thị đường dẫn lớp mặc định, không chứa "." (thư mục địa phương)

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