2012-05-08 47 views
8

Tôi đang gặp hai vấn đề liên quan đến việc biên dịch và chạy một dự án java Eclipse từ dòng lệnh. Điều này làm việc tốt khi tôi chỉ chạy từ IDE nhật thực. Tôi đã thử googling nhưng không thể thực sự có được những điều làm việc. Bất kỳ sự giúp đỡ nào cũng được đánh giá cao.Chạy dự án Eclipse từ dòng lệnh

Vấn đề 1: Khi tôi cố gắng biên dịch từ một vị trí khác với thư mục chứa tệp .java, nó sẽ phát ra lỗi "không thể đọc: myfile.java". Nhưng nếu tôi di chuyển đến thư mục này thì nó sẽ biên dịch.
Lệnh mà tôi đã được đưa ra là (khi trong một số thư mục khác):
javac -cp C: \ ABC \ src \ XYZ myfile.java
Lệnh mà tôi đã được đưa ra khi trong thư mục XYZ:
javac myfile.java
này tạo ra hai tập tin myfile.class .class và Testing_Thread.class (tôi đoán này bởi vì tôi có một sợi trong mã của tôi)

vấn đề 2: Sau khi tôi đã biên soạn bằng cách vào thư mục của nó , khi tôi cố gắng chạy chương trình, tôi nhận được lỗi "Ngoại lệ trong chuỗi" chính "java.lang.NoClassDefFoundError: myfile (tên sai: XYZ/myfile.java)" ngay cả khi tôi đang cố chạy từ thư mục XYZ. Tôi gặp lỗi tương tự khi tôi cố gắng chạy từ một số nơi khác.
Lệnh mà tôi đã được đưa ra khi trong XYZ thư mục:
java myfile
Lệnh mà tôi đã được đưa ra khi ở một số nơi khác:
java -cp C: \ ABC \ src \ XYZ myfile

tôi cũng gắn một hệ thống các cấu trúc thư mục của tôi nếu nó là của bất kỳ sự giúp đỡ:
enter image description here

Trả lời

8

những ví dụ này giả định cơ cấu nguồn sau:

C:\temp\compile-test\src\a\b\c\D.java 

đâu D.java là:

package a.b.c; 

public class D { } 

Vấn đề đầu tiên, không thể đọc: myfile.java, là bởi vì nó không phải là đúng để sử dụng các tùy chọn dòng cp lệnh để chỉ vào mã nguồn của bạn.

C:\temp\compile-test\src>javac -cp c:\temp\compile-test\src\a\b\c D.java 
javac: file not found: D.java 
Usage: javac <options> <source files> 
use -help for a list of possible options 

này thay vì nên những điều sau đây, nơi javac được chạy từ thư mục nguồn của bạn, và chúng tôi có thể sử dụng đường dẫn tương đối so với các tập tin nguồn (Chú ý - javac được chạy từ thư mục nguồn ở đây):

C:\temp\compile-test\src>javac a\b\c\D.java 

Hoặc này, nơi chúng tôi chỉ định đường dẫn đầy đủ đến file nguồn, và javac có thể chạy từ bất cứ nơi nào (Chú ý - javac được chạy từ C:\ đây):

C:\>javac temp\compile-test\src\a\b\c\D.java 

Cả hai tùy chọn ở trên sẽ dẫn đến tệp lớp học của bạn được tạo trong cùng thư mục với nguồn. I E.:

C:\temp\compile-test\src\a\b\c\D.class 

Đối với vấn đề thứ hai, nếu bạn cố gắng và chạy một lớp học có tên gói từ 'bên trong' gói, điều này sẽ dẫn đến tên là sai (Chú ý - java được chạy từ 'bên trong' gói ở đây):

C:\temp\compile-test\src\a\b\c>java D 
Exception in thread "main" java.lang.NoClassDefFoundError: D (wrong name: a/b/c/D) 
     at java.lang.ClassLoader.defineClass1(Native Method) 
     at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631) 
     at java.lang.ClassLoader.defineClass(ClassLoader.java:615) 
     at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) 
     at java.net.URLClassLoader.defineClass(URLClassLoader.java:283) 
     at java.net.URLClassLoader.access$000(URLClassLoader.java:58) 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:197) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 
Could not find the main class: D. Program will exit. 

Để chạy lớp D, bạn nên có gói 'root', và cung cấp các Fully Qualified Class Name. I.e .:

C:\temp\compile-test\src>java a.b.c.D 
Exception in thread "main" java.lang.NoSuchMethodError: main 

Lưu ý Tôi nhận được ngoại lệ là lớp D không có phương pháp chính và do đó không thể chạy được. Để khắc phục, chúng ta thêm một phương pháp chính:

package a.b.c; 

public class D { 
    public static void main(String[] args) { 
     System.out.println("main"); 
    } 
} 

và chạy lại:

C:\temp\compile-test\src>java a.b.c.D 
main 
+0

Cảm ơn lời giải thích rõ ràng tuyệt vời :) – sachin11

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