2013-11-26 22 views
28

Maven Compiler Plugin tài liệu states:Sự khác nhau giữa việc sử dụng javac và javax.tools.JavaCompiler là gì?

Các trình biên dịch Plugin được sử dụng để biên dịch các nguồn dự án của bạn. Kể từ 3.0, trình biên dịch mặc định là javax.tools.JavaCompiler (nếu bạn đang sử dụng java 1.6) và được sử dụng để biên dịch các nguồn Java. Nếu bạn muốn để buộc các plugin sử dụng javac, bạn phải cấu hình các tùy chọn Plugin forceJavacCompilerUse

Và quả thực khi forceJavacCompilerUse không được xác định trong xây dựng của chúng tôi có một số build lỗi, ví dụ như khi mã tham chiếu com.sun. gói (di sản , chúng tôi biết rằng đó là một ý tưởng tồi ...)

Sự khác biệt khác giữa hai chế độ biên dịch này nói chung và với maven là gì? Có bất kỳ sự khác biệt đầu ra mà một trong những nên biết?

+3

+1 câu hỏi hay –

+0

có lẽ không liên quan, nhưng bạn có thể đăng cấu hình trình biên dịch trình biên dịch maven của mình không? – Yaneeve

+2

JavaDoc: http://docs.oracle.com/javase/6/docs/api/javax/tools/JavaCompiler.html – Raedwald

Trả lời

14

javac (dưới dạng "trình biên dịch java") là tệp thực thi, có thể về mặt lý thuyết ngay cả tệp thực thi phụ thuộc vào nền tảng hoặc tập lệnh. Điều này được gọi để biên dịch một số .java thành .class.

Trên cửa sổ có tên là javac.exe và thường là ở đâu đó bên dưới C:\Program Files*\jdk*\bin.

Trình biên dịch này cũng được phát triển trong java. Điều đó có nghĩa, nếu chúng ta bắt đầu .exe này, một máy ảo java mới cần được bắt đầu để chạy nó. Đây là chậm. Tuy nhiên, bởi vì nó được viết bằng Java, có một giải pháp thay thế nhanh hơn nhiều: từ jvm đã chạy của chúng tôi, chúng tôi chỉ đơn giản là import lớp chính của nó (ví dụ: javax.tools.JavaCompiler hoặc như vậy) và gọi nó. Điều này không cần phải bắt đầu một jvm không cần thiết. Đó là những gì maven làm. Đơn giản chỉ cần 10 năm là đủ để làm điều này một cách chính xác. :-)

Tất nhiên nó cũng có một số hạn chế. Để nguyên nhân có thể xảy ra nhất là trong trường hợp của trình biên dịch nội bộ nó cần phải chạy từ cùng một jvm và trong cùng một không gian tên như lõi maven. Ngoài ra, việc chỉ định một jvm thay thế là không thể, và có thể có một số tác dụng phụ cũng như do các xung đột không gian tên. Nhưng chúng rất không thể xảy ra, vì cả hai đều là phần mềm được thiết kế tốt.

+0

Điểm tốt, tôi muốn nhận thêm thông tin về sự khác biệt giữa chức năng hoạt động của hai cách đó, như sự khác biệt trong bài đăng gốc. – Vic

+0

@Vic Tôi đã mở rộng câu trả lời của mình một chút và sẽ thực hiện một chút. – peterh

+0

Cảm ơn. Những gì tôi muốn là một lời giải thích về lý do tại sao một chế độ sẽ ném lỗi và thứ hai sẽ không. Và sự khác biệt khác, nếu tồn tại – Vic

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