2012-06-14 15 views
9

Tôi có lớp hai java như sau:làm thế nào để chạy các lớp java với có tên gói

1.

none package class 
System.out.println("App1 hello world..."); 

2.

has package 
package java.java.package1; 

System.out.println("App1 hello world..."); 

sau đó, tôi biên dịch và chạy chúng, kết quả như sau:

D:\javaTest>javac App1.java 

D:\javaTest>javac App2.java 

D:\javaTest>java App1 
App1 hello world... 

D:\javaTest>java java.java.package1.App2 

Exception in thread "main" java.lang.NoClassDefFoundError: java/java/package1/Ap 
p2 
Caused by: java.lang.ClassNotFoundException: java.java.package1.App2 
     at java.net.URLClassLoader$1.run(Unknown Source) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(Unknown Source) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 
Could not find the main class: java.java.package1.App2. Program will exit. 

để chạy lớp App2?

Trả lời

18

Bạn nên biên dịch bằng cách sử dụng tùy chọn -d để các lớp học kết thúc trong một hệ thống phân cấp thư mục thích hợp:

javac -d . App2.java 
java java.java.package1.App2 

Ngoài ra, bạn không nên sử dụng tên gói bắt đầu với java ở nơi đầu tiên.

Ngoài ra, nếu bạn đặt nguồn trong hệ thống phân cấp thư mục thích hợp và biên dịch/chạy từ gốc của cấu trúc phân cấp, bạn sẽ không gặp phải vấn đề này.

+1

Ngoài những gì Chuck Norris đã nói: Khi bạn biên dịch và bạn ở gốc của thư mục, bạn phải sử dụng '/' thay vì '.'. Khi bạn chạy chương trình, nó được đảo ngược: sử dụng '.' thay vì'/'. –

0

App2 cần nằm trong thư mục java/java/package1. Trong java, tên gói và thư mục cho mã nguồn phải khớp. Bạn không nhận được lỗi biên dịch?

1

Bạn phải đặt -d directory Options..because

Đặt thư mục đích cho các file lớp. Nếu một lớp học là một phần của gói , javac đặt tệp lớp trong thư mục con phản ánh tên gói, tạo thư mục nếu cần. Ví dụ, nếu bạn chỉ định -d c: \ myclasses và lớp được gọi là com.mypackage.MyClass, thì tệp lớp được gọi là c: \ myclasses \ com \ mypackage \ MyClass.class.

0

Bạn tạo một thư mục mới. Đây là thư mục chứa tác phẩm của bạn và không phải là bắt đầu các gói của bạn.

Ví dụ: tôi tạo thư mục/terri để bắt đầu.

Tôi sau đó tạo cấu trúc thư mục/clarie/andrea bên dưới. Gói của tôi sẽ được gọi là claire.andrea trong ví dụ này. Tên gói thông thường bắt đầu bằng com và sau đó là tên công ty hoặc một cái gì đó tương tự (hoặc java cho các gói java chuẩn, vì vậy đừng sử dụng tên đó: như java.lang. *).

Trong thư mục andrea, tôi tạo một tệp java có tên Saluton.java với lớp Saluton (chỉ in hello). Tên lớp và tên tệp phải khớp.

Để biên dịch, từ terri/thư mục:. Javac \ claire \ andrea \ Saluton.java này sẽ tạo ra một Saluton.class trong \ terri \ claire \ andrea \ Saluton.class

Để chạy: (một lần nữa từ/terri), tôi làm: java -cp. claire.andrea.Saluton Mà nói, sử dụng đường dẫn lớp từ thư mục hiện tại của tôi.
Chương trình chính của tôi là trong gói claire.andrea và tên Lớp là Saluton.

Đây là lần chạy: \ terri java -cp. claire.andrea.Saluton

"Hello World".

Để tổng hợp, tên gói khớp với cấu trúc thư mục cơ bản. Tệp (nếu nó tham chiếu đến gói) phải nằm trong cấu trúc thư mục mà nó đang tham chiếu. Nếu tôi biên dịch Saluton.java trong/terri với gói claire.andrea tôi đã không tìm thấy cách để chạy nó, nó biên dịch tốt.

Ngoài ra, tên tệp cho lớp phải khớp với lớp công khai trong tệp đó.

Để chạy, package.Class. Nói chung, các gói không được viết hoa và các lớp được.

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