Những gì tôi đang cố gắng làm là viết một số plugin Maven quét các lớp ứng dụng tìm kiếm việc thực hiện một giao diện cụ thể (nó có thể là các lớp với một số chú thích) và cơ sở trên kết quả tạo ra một số mã. Tôi đã triển khai thành công plugin đang chạy trong giai đoạn tạo nguồn và viết mã nguồn vào thư mục nguồn đã tạo.quét java classpath trong maven plugin
Vấn đề là với đường dẫn lớp quét cho các triển khai/lớp giao diện cụ thể với một số chú thích. Tôi đang sử dụng thư viện Reflections để quét lớp theo cách sau:
private Set<Class< ? extends MyInterface >> scan(final String packageName) {
final Reflections reflections = new Reflections(packageName);
return reflections.getSubTypesOf(MyInterface.class);
}
Thật không may, phương pháp này trả về tập rỗng. Khi tôi in classpath của tôi trong lớp mở rộng org.apache.maven.plugin.AbstractMojo
(giống trong đó tôi đang sử dụng Reflections) tôi nhận được kết quả sau:
/home/pd5108/apache-maven-2.2.1/boot/classworlds- 1.1.jar
Các lớp tôi muốn tìm bằng Reflections tồn tại trong các JAR phụ thuộc cũng như trong mô-đun trong đó plugin được định cấu hình. Nhìn vào classpath được in ra, có vẻ như vào thời điểm này (phụ thuộc vào nguồn tạo ra) các phụ thuộc được định nghĩa trong maven, tất cả đều không có trên classpath - có lẽ chúng được thêm vào trong các phase tiếp theo. Điều đó có đúng không? Có cách tiếp cận nào khác mà tôi có thể sử dụng không?
Dưới đây là cách làm thế nào classpath được in ra:
URL[] urls = ((URLClassLoader)sysClassLoader).getURLs();
for(int i=0; i< urls.length; i++) {
System.out.println(urls[i].getFile());
}
Đó là tùy chọn tôi xem là phương sách cuối cùng ... Vì tôi có nhiều lớp triển khai giao diện này và tất cả chúng đều được xem xét trong quá trình tạo mã tôi muốn tránh nhập tất cả chúng 'tĩnh'. Ngoài ra, các lớp này thường được thêm/xóa. –
Bạn luôn có thể có một kịch bản lệnh shell đã thực hiện một cái gì đó như grep tất cả các tệp java cho "triển khai X" và sau đó phân tích cú pháp các tên lớp và xây dựng một tệp thuộc tính của chúng. Sau đó, có plugin của bạn sử dụng tập tin bất động sản để biết những gì các lớp học để tạo thêm mã cho là tốt. Nếu bạn không phải là unix, bạn có thể mô phỏng grep trong java tôi cho rằng, nhưng nó sẽ chậm hơn nhiều. – Michael