2016-09-11 23 views
8

TL; DR
Tôi Looking for the javac API plugin mà sẽ cho phép tôi ghi lại tất cả các lớp học cần thiết bởi trình biên dịch Java cho một tập tin nguồn cụ thể.Bảng liệt kê tất cả các lớp trình biên dịch java cần trong biên soạn

Nhiều bối cảnh:
Tôi đang viết một công cụ để di chuyển từ Maven để Bazel và là một trong những thách thức (và cơ hội) có là Bazel cho phép, và hưởng lợi từ một granularity hạt mịn hơn nhiều "module ". Ngoài ra phụ thuộc không phải là transitive đối với biên dịch classpath.

Tôi đang cố gắng tạo biểu đồ phụ thuộc của mã và đã sử dụng mã byte cộng với chẩn đoán trên mã nguồn (cho hằng số, nhập khẩu, v.v.) nhưng đã tình cờ gặp trường hợp cạnh mà tôi sợ, chỉ có thể được giải quyết bằng cách sử dụng một plugin trình biên dịch.

Cho một phương pháp Foo trong lớp Concrete mà chấp nhận một giao diện SomeInterface kéo dài ParentInterface sau đó javac nhu cầu cả SomeInterfaceParentInterface trong classpath biên dịch mặc dù ParentInterface không xuất hiện trong các bytecode hoặc trong mã nguồn.

này được giải quyết trong Maven vì sự phụ thuộc bắc cầu liên quan đến lập classpath nhưng tôi muốn tránh điều đó vì đây được mở rộng đáng kể classpath (chủ yếu là thú vị đối với dependnecies nguồn và xây dựng gây ra với).

Tôi đang cố gắng xem liệu tôi có thể sử dụng compiler plugins để xác định tất cả các lớp mà trình biên dịch cần cho một tệp nguồn đã cho hay không. Điều này sẽ giúp tôi kể từ khi tôi có thể chạy maven của tôi xây dựng một lần để thu thập thông tin và sau đó tạo ra các đồ thị từ thông tin này. Vấn đề là tôi bị mất một chút so với các API.

Cảm ơn!

+1

Bạn có thể kiểm tra SomeInterface để xem nó cần một ParentInterface. Bạn có thể sử dụng phân tích phản chiếu hoặc mã byte. Nếu điều đó nghe có vẻ quá khó, tôi có thể đảm bảo với bạn rằng việc cố gắng sử dụng trình biên dịch để có được thông tin này là gấp 10 lần. –

+0

@PeterLawrey Cảm ơn!Phản ánh có lẽ sẽ không giúp tôi vì tôi quan tâm đến thời gian xây dựng nhưng mã byte có thể hoạt động. Vấn đề là chỉ trong một số trường hợp tôi cần cha mẹ và cách tiếp cận của bạn bắt buộc phải học tất cả các trường hợp cạnh này hoặc mở rộng phạm vi cho tất cả các loại phụ trợ và tổ tiên của chúng (và điều này tất nhiên có thể là bên thứ ba làm phức tạp nó hơn nữa) ... – Ittai

+0

có. Bạn cũng sẽ cần bất kỳ lớp nào thu được thông qua sự phản chiếu trong thời gian chạy mà có thể khó xác định hơn. –

Trả lời

0

Vâng, câu hỏi cần có lớp nào để biên dịch IS là chuyển tiếp. Vì vậy, không có cách nào để ánh xạ điều này trên một hệ thống phụ thuộc không chuyển đổi, trừ khi bạn kéo tất cả chúng trong cùng một mô-đun.

Điều bạn kết thúc là biểu đồ, trong đó các nút là lớp và một cạnh giữa A và B mô tả rằng A được sử dụng trong B. Bây giờ mọi lớp có thể truy cập từ A cần phải phụ thuộc vào A. Bạn sẽ có thể xây dựng các mô-đun dưới dạng biểu đồ con được kết nối.

Vì vậy, ví dụ của bạn, sau khi phân tích Bê tông, bạn phân tích SomeInterface, và sau đó phân tích ParentInterface. Bạn xây dựng đồ thị của các phụ thuộc trực tiếp khi bạn đi và tự tính toán các phụ thuộc chuyển tiếp.

Khi bạn tự giải quyết sự chuyển đổi, không cần phải làm gì ngoài phân tích mã byte (ví dụ: qua ASM) để tìm các lớp cần thiết. Sự phụ thuộc duy nhất mà sẽ bị mất trong biên dịch là một nhập khẩu không sử dụng, có thể được gỡ bỏ (và rất nhiều hướng dẫn phong cách java thậm chí nói nó phải được loại bỏ).

PS: Không biết bazel, điều này có vẻ như bạn đang tạo các cách thức cho các mô-đun nhỏ.

+0

những gì bạn mô tả là đóng cửa chuyển tiếp hoàn toàn không phải là những gì tôi muốn. Tôi muốn đóng cửa chuyển tiếp nhỏ nhất mà tôi có thể sống và có thể đạt được bằng một trong hai cách sau: 1. Trình biên dịch plugin để liệt kê tất cả các lớp cần thiết. 2. Hiểu biết về các loại phụ thuộc mà điều này là cần thiết và chỉ chuẩn bị cho những loại đó. Ở Scala, tôi đang sử dụng phương pháp cũ – Ittai

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