2009-10-14 15 views

Trả lời

36

Phương pháp javax.tools.JavaCompiler#getTask() có tham số options cho phép đặt tùy chọn trình biên dịch. sau message mô tả một cách dễ dàng để thiết lập chúng để truy cập vào classpath chương trình gọi điện thoại của:

Bạn cần phải cấu hình quản lý tập tin tiêu chuẩn java để biết về file jar (s) - bạn sử dụng trình biên dịch đối số tùy chọn để thực hiện điều đó.

Theo mặc định, java biên dịch đối tượng dường như chỉ biết về mặc định địa điểm cho bootclasspath, extdirs và endorseddirs thư mục về của classpath của nó.

Bạn cần phải thêm classpath hiện chương trình gọi điện thoại để trình biên dịch java sơ thẩm mà được thông qua trên trình quản lý file tiêu chuẩn, mà sẽ sau đó tìm các lớp học trong các tập tin jar.

Đây là cách tôi làm điều đó trong the compiler wrapper I wrote

List<String> optionList = new ArrayList<String>(); 
// set compiler's classpath to be same as the runtime's 
optionList.addAll(Arrays.asList("-classpath",System.getProperty("java.class.path"))); 

// any other options you want 
optionList.addAll(Arrays.asList(options)); 

JavaCompiler.CompilationTask task = compiler.getTask(out,jfm,diagnostics,optionList,null,jfos); 

Tất cả các bạn sẽ cần sau đó là để có được các thiết lập classpath thích hợp khi chạy chương trình gọi điện thoại.

+0

Satheesh gửi đây là một câu trả lời, "Bạn có thể chia sẻ trình biên dịch của bạn (liên kết không hoạt động) cảm ơn trước." –

+0

cảm ơn một nhà máy cho bài đăng này, tôi đã đấu tranh với điều này cho lứa tuổi và đây là câu trả lời ... :) – flexinIT

+2

BTW, 'classpath' tùy chọn của' JavaCompiler' không "hiểu" ký tự đại diện. Vì vậy, mỗi 'jar' bạn phải thêm trực tiếp vào chuỗi này. – Andremoniy

2

Cùng một vấn đề xảy ra với tôi gần đây, cuối cùng tôi đã tìm thấy hai cách giải quyết. Bạn có thể thiết lập các đường dẫn lớp bằng cách gọi StandardJavaFileManager.setLocation (StandardLocation.CLASS_PATH, "YOUR_CLASS_PATH") hoặc Compiler.getTask (ARG_0, ARG_1, ARG_2, CLASS_PATH_OPTIONS, cũng giống như câu trả lời đầu tiên được đăng ở đây nói.

+0

Để làm việc này tôi cần làm 'StandardJavaFileManager.setLocation (StandardLocation.CLASS_PATH, Arrays.asList (tệp mới (classpath)));' –