2011-01-21 26 views
65

Trường hợp sử dụng rất đơn giản. Tôi đã nhận được các tệp nguồn đã được tạo bằng Eclipse. Vì vậy, có một cấu trúc thư mục sâu, nơi bất kỳ lớp Java nào có thể tham chiếu đến một lớp Java khác trong cùng một thư mục con, anh chị em hoặc thư mục cha.Java: Làm thế nào tôi có thể biên dịch toàn bộ cấu trúc thư mục của mã?

Làm cách nào để biên dịch toàn bộ điều này từ thiết bị đầu cuối bằng javac?

+0

Ngoài sự tò mò, bạn đang sử dụng hệ điều hành nào - Windows, Linux, Mac, v.v ...? Điều này có thể giúp trả lời câu hỏi –

+0

tôi đang sử dụng Linux. – euphoria83

+1

Tôi chưa biên dịch java trên dòng lệnh trong một vài năm nhưng tôi nghĩ nếu bạn chỉ chuyển file chứa main() của bạn tới javac, nó sẽ tìm kiếm tất cả các file khác cần biên dịch như tất cả các phụ thuộc của bạn được phát hiện bắt đầu từ tệp chứa main(). – Endophage

Trả lời

49

Bạn phải biết tất cả các thư mục hoặc có thể sử dụng ký tự đại diện ..

javac dir1/*.java dir2/*.java dir3/dir4/*.java dir3/dir5/*.java dir6/*src/*.java 
+1

tôi figured it: chỉ cần liệt kê tất cả các tập tin .java sau khi javac hoặc sử dụng tên hoặc ký tự đại diện của họ. – euphoria83

+22

Hoặc chỉ sử dụng 'javac $ (find. -name" * .java ")'. –

8

Bạn sẽ phải sử dụng một cái gì đó giống như Ant để làm điều này theo thứ bậc:

http://ant.apache.org/manual/Tasks/javac.html

Bạn sẽ cần phải tạo ra một kịch bản xây dựng với mục tiêu được gọi là biên dịch chứa sau:

<javac sourcepath="" srcdir="${src}" 
     destdir="${build}" > 
    <include name="**/*.java"/> 
</javac> 

Sau đó, bạn sẽ có thể biên dịch tất cả các tệp bằng cách chạy:

ant compile 

Hoặc, nhập dự án của bạn vào Eclipse và nó sẽ tự động biên dịch tất cả các tệp nguồn cho dự án đó.

+0

thật không may, điều này sẽ được thực hiện trên máy chủ không hỗ trợ kiến. – euphoria83

12

Tôi sẽ lấy đề xuất của Jon và sử dụng Ant, vì đây là một nhiệm vụ khá phức tạp.

Tuy nhiên, nếu bạn quyết tâm nhận tất cả trong một dòng trong Thiết bị đầu cuối, trên Linux, bạn có thể sử dụng lệnh find. Nhưng tôi không khuyên bạn nên điều này, vì không có gì đảm bảo rằng, Foo.java sẽ được biên dịch sau khi Bar.java, mặc dù Foo sử dụng Bar. Một ví dụ sẽ là:

find . -type f -name "*.java" -exec javac {} \;

Nếu tất cả các lớp học của bạn chưa được biên soạn nêu ra, nếu có một khai thác chính hoặc lớp điều khiển (về cơ bản là một trong chứa phương pháp chính của bạn), biên dịch rằng lớp học chính nên cá nhân biên dịch hầu hết các dự án, ngay cả khi chúng nằm trong các thư mục khác nhau, vì Javac sẽ cố gắng hết sức để giải quyết các vấn đề phụ thuộc.

+1

trên cửa sổ người ta có thể sử dụng 'find_gnu. -type f -name "* .java" | xargs javac' một khi phiên bản gnu của find.exe được đổi tên thành find_gnu.exe. Tôi đã nhận gnu find.exe của tôi từ msysgit. – n611x007

+0

Hoặc trên hàng loạt Windows thuần túy: 'for/f" usebackq "% f trong (' 'dir/s/b * .java'') làm javac% f' (sử dụng một dấu nháy đơn trong' dir/s/b' nhưng tôi không thể tìm thấy một cách để định dạng nó đúng cách). – Matthieu

45

Với Bash 4, bạn chỉ có thể kích hoạt globstar

shopt -s globstar 

và sau đó làm

javac **/*.java 
+2

hoặc sử dụng zsh với oh-my-zsh :) – DmitrySandalov

2

Có một cách để làm điều này mà không sử dụng một nhân vật đường ống, đó là tiện lợi nếu bạn đang giả mạo quy trình từ ngôn ngữ lập trình khác để thực hiện việc này:

find $JAVA_SRC_DIR -name '*.java' -exec javac -d $OUTPUT_DIR {} + 

Mặc dù nếu bạn đang ở trong Bash và/hoặc không nhớ sử dụng một đường ống, sau đó bạn có thể làm:

find $JAVA_SRC_DIR -name '*.java' | xargs javac -d $OUTPUT_DIR 
31

Nếu tất cả các bạn muốn làm là chạy lớp chính của bạn (không có biên dịch các tập tin trên .java mà lớp chính không phụ thuộc), sau đó bạn có thể làm như sau:

cd <root-package-directory> 
javac <complete-path-to-main-class> 

hoặc

javac -cp <root-package-directory> <complete-path-to-main-class> 

javac sẽ tự động giải quyết tất cả các phụ thuộc và biên dịch tất cả các phụ thuộc là tốt.

+3

Đây là giải pháp làm việc dễ nhất hiện nay. Tại sao mọi người không thích nó? – Alphaaa

+9

Có lẽ vì tính đơn giản của nó bỏ qua thực tế là nhiều công việc biên dịch cho thư viện hoặc mã hỗ trợ sẽ không có một phương thức chính liên kết đến tất cả các phụ thuộc bắt buộc. Đó là một câu trả lời hay, nhưng không phải là câu trả lời tôi từng sử dụng trong bất kỳ khung công tác/khung công cộng nào. – Ajax

+2

IMHO, các khuôn khổ hoặc bất kỳ dự án công cộng nào khác nên sử dụng một số loại quản lý xây dựng. Loại biên dịch này, chỉ có ý nghĩa đối với các dự án tư nhân nhỏ. – svenwltr

9

Tiếp theo là phương pháp tôi thấy:

1) Thực hiện một danh sách các file với đường dẫn tương đối trong một tập tin (nói FilesList.txt) như sau (hoặc không gian tách hoặc dòng tách ra):

foo/AccessTestInterface.java 
foo/goo/AccessTestInterfaceImpl.java 

2) Sử dụng lệnh:

javac @FilesList.txt -d classes 

này sẽ biên dịch tất cả các file và đặt các tập tin lớp bên trong thư mục lớp học.

Bây giờ, cách dễ dàng để tạo FilesList.txt là: Chuyển đến thư mục gốc nguồn của bạn.

dir *.java /s /b > FilesList.txt 

Nhưng, điều này sẽ điền đường dẫn tuyệt đối. Sử dụng trình chỉnh sửa văn bản "Thay thế tất cả" đường dẫn đến thư mục nguồn (bao gồm \ ở cuối) bằng "" (ví dụ: chuỗi trống) và Lưu.

+0

đây là cách "bản địa" hơn, vì javac hỗ trợ tệp "batch" – lovespring

+0

"dir * .java/s/b> FilesList.txt" sẽ không hoạt động nếu đường dẫn chứa dấu cách. javac sẽ phàn nàn về FilesList.txt – aderesh

1

Giải pháp Windows: Giả sử tất cả các tệp có trong thư mục con 'src' và bạn muốn biên dịch chúng thành 'bin'.

for /r src %i in (*.java) do javac %i -sourcepath src -d bin 

Nếu src chứa một file java ngay dưới nó thì đây là nhanh hơn

javac src\\*.java -d bin 
+1

hoạt động, nhưng superslow - javac được gọi với một tập tin chỉ cho mỗi cuộc gọi, vì vậy nếu bạn có rất nhiều trong số chúng ... –

7

Các đã tồn tại những câu trả lời dường như chỉ liên quan đến bản thân với * .java tập tin bản thân và không làm thế nào để dễ dàng làm nó với các tập tin thư viện có thể cần thiết cho việc xây dựng.

Tình huống một dòng một cách dễ dàng thu thập tất cả các tệp * .java cũng như bao gồm *.file jar cần thiết cho việc xây dựng là:

javac -cp ".:lib/*" -d bin $(find ./src/* | grep .java) 

Ở đây, file bin là điểm đến của các tệp class, lib (và có khả năng thư mục làm việc hiện hành) chứa các tập tin thư viện và tất cả các file java trong thư mục src và bên dưới là biên soạn.

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