2013-06-17 34 views
15

Tôi đang biên soạn nhiều file trong một thư mục (javac * .java) nhưng tôi có một vấn đề khi tôi cố gắng để làm điều này:làm thế nào để biên dịch nhiều file java khi có file java trong các gói khác

tôi nhận biên dịch lỗi nói rằng nói javac không thể tìm thấy một biểu tượng của một đối tượng.

Tôi có nhiều gói chứa tệp java cần thiết để chạy chương trình chính. Nhưng có vẻ như việc cố gắng biên dịch từng cái một sẽ không hiệu quả. Nó chạy tốt trong IDE của tôi nhưng tôi quan tâm đến việc học cách nó được thực hiện thông qua Command Prompt.

Chương trình chính nằm trong thư mục trình điều khiển.

Tôi đã cố gắng biên dịch các tệp theo thứ tự phụ thuộc nhưng điều đó không thành công. this is a screenshot of the folders

+0

Nếu trong 'argfile' bạn có danh sách tất cả các tệp cần biên dịch, bạn có thể chạy [' javac @ argfile'] (http://docs.oracle.com/javase/7/docs/technotes/tools/ windows/javac.html # commandlineargfile). Nếu bạn đang sử dụng libs khác, bạn phải thêm classpath chúng. – Alberto

+0

Khi tôi làm một cái gì đó như chỉnh sửa tên đường dẫn lớp (trong trường hợp này), nơi tôi nên làm điều đó và làm thế nào? Tôi đã nghe nói về điều đó đang được thực hiện bên trong tập tin manifest, tuy nhiên tôi biết rằng nó có thể được thực hiện trong các thiết lập hệ điều hành là tốt. – OKGimmeMoney

+0

Bạn có thể thêm phụ thuộc classpath thông qua tùy chọn '-classpath' như:' javac -classpath \ examples; \ lib \ Banners.jar \ examples \ greetings \ Hi.java'. Xem http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html và http://docs.oracle.com/javase/7/docs/technotes/tools/windows/ classpath.html. – Alberto

Trả lời

19

Javac documentation cung cấp tất cả thông tin cần thiết. Tuy nhiên, có thể hữu ích khi sử dụng Ant hoặc Maven để xây dựng dòng lệnh.

This trang cung cấp một ví dụ hay về cách sử dụng javac đầu tiên và sau đó là Ant để xây dựng một dự án đơn giản.


Đây là một ví dụ về dự án và cách được biên dịch bằng javac.

Cấu trúc cây của dự án là:

. 
    ├── build 
    └── src 
     ├── attacks 
     ├── drivers 
     │   └── Driver.java 
     └── exceptions 
      └── MyException.java 

Có hai thư mục đặc biệt - build để chứa các lớp học biên soạn và src để chứa file nguồn (có thể là trong thư mục con khác nhau - bao bì).

Lệnh sau đây biên dịch toàn bộ dự án và đặt kết quả vào thư mục build.

javac -sourcepath src -d build src/**/*.java 

-sourcepath src chỉ định thư mục src là nơi tất cả nguồn có thể được trình biên dịch tìm thấy. Các tùy chọn -d build cho trình biên dịch biết nơi đặt các tệp được biên dịch.

Tùy chọn src/**/*.java cho trình biên dịch biết tệp nào thực sự biên dịch. Trong trường hợp cụ thể này, nó yêu cầu javac nhìn xuống hai cấp độ và chọn tất cả * .java ở cấp đó.

Nếu có *.java tệp ở các cấp khác nhau hơn danh sách tệp cần được chỉ định. Đối với điều này, người ta có thể tạo ra danh sách như một tập tin bên ngoài và vượt qua các tập tin này như trong tùy chọn đầu vào cho javac.

Sau đây là cách này có thể được thực hiện dưới Linux/Unix:

find -name "*.java" > source.txt 

Lệnh trên sẽ tạo ra source.txt tập tin có chứa đường dẫn đầy đủ cho các file java * được tìm thấy.Ví dụ này nó chứa:

./src/drivers/Driver.java 
./src/exceptions/MyException.java 

Để biên dịch dự án với danh sách các file nguồn đỏ mặt vào source.txt, lệnh sau đây có thể được sử dụng:

javac -d build @source.txt 

Xin lưu ý rằng @source.txt quy định tại các kết thúc cho trình biên dịch biết nơi tìm kiếm danh sách các tệp nguồn. Cũng xin lưu ý rằng tùy chọn -sourcepath có thể được bỏ qua.

Đây là cách cấu trúc thư mục thay đổi sau khi chạy lệnh trên.

. 
├── build 
│   ├── drivers 
│   │   └── Driver.class 
│   └── exceptions 
│    └── MyException.class 
└── src 
    ├── attacks 
    ├── drivers 
    │   └── Driver.java 
    └── exceptions 
     └── MyException.java 

Có thể quan sát thấy thư mục build hiện chứa các tệp lớp được biên dịch trong các gói tương ứng.

Và nếu bạn muốn chạy, giả sử, ví dụ: Driver có phương thức main, lệnh sau sẽ thực hiện chương trình.

java -cp .:build:**/*.class drivers.Driver 

Xin lưu ý rằng tập tin tách : (dấu hai chấm) được sử dụng dưới Unix, Windows thay đổi nó để ; (dấu chấm phẩy).

+0

Tôi sẽ xem qua tài liệu. Một vấn đề khác mà tôi gặp phải là khi tôi nhận được tệp .jar, nó sẽ không chạy như nó chạy trong IDE. Biểu tượng chỉ nhấp nháy và sau đó không làm gì cả. – OKGimmeMoney

+0

@CanIHaveSomeChange Tốt nhất là bạn nên đăng ký vấn đề khác này như một câu hỏi khác. Bạn đã biên soạn dự án thành công chưa? – 01es

+0

Tôi chưa nhận được chương trình để biên dịch. Điều gì đang xảy ra trong bài đăng gốc. – OKGimmeMoney

1

hai lựa chọn:

1) Sử dụng dòng lệnh để xác định tất cả các file để biên dịch

2) Tạo một tập tin với tất cả các tên tập tin (đầu ra từ tìm kiếm, có lẽ), và chạy javac @argfile

+0

Bạn muốn ném tất cả các tệp java vào một thư mục? Tôi sẽ thử điều này như một thử nghiệm, nhưng nó không phải là một giải pháp cuối cùng. – OKGimmeMoney

+0

Không, anh ta không nói gì về việc đưa tất cả các tệp java vào một thư mục. Đừng làm thế, nó không thể hoạt động được. – EJP

+0

Tôi không chắc liệu tôi có làm đúng hay không nhưng tôi đã gặp lỗi này sau khi thử chạy chương trình sau bước đầu tiên của bạn: OK, tôi đã thử điều này và bây giờ tôi gặp lỗi thời gian chạy có nội dung "java. lang.NoClassDefFoundError: ProgramName Tôi không biết cách thực hiện bước thứ hai, tôi đọc qua Tài liệu Java được đề xuất trong chủ đề này bởi người khác và tôi không hiểu cách sử dụng nó. – OKGimmeMoney

3

I am compiling multiple files in a directory (javac *.java)

Đã lỗi. Điều đó sẽ chỉ hoạt động chính xác nếu các lớp Java không có trong các gói. Các cách chính xác để làm điều này là như sau, nơi src là tên của thư mục mà ở đó tất cả các thư mục gói của bạn bắt nguồn từ:

cd src 
javac package1/package2/*.java 
javac package3/package4/package5/*.java 

vv cho bất cứ điều gì bố trí gói/thư mục của bạn. Mỗi dòng lệnh javac sẽ biên dịch tất cả các tệp trong thư mục có tên là tất cả các tệp .java trong các gói/thư mục khác mà nó phụ thuộc vào chưa được biên dịch hoặc đã lỗi thời.

Xem tài liệu Công cụ cho javac.

+0

Đây chính xác là những gì tôi đang tìm kiếm. Cảm ơn rất nhiều! :) – Hari

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