TL; DR
Ich suche nach den javac
-Plugin-APIs, die es mir ermöglichen, alle Klassen zu protokollieren, die der Java-Compiler für eine bestimmte Quelldatei benötigt.
Mehr Kontext:
Ich schreibe ein Werkzeug, um von Maven
zu Bazel
zu migrieren, und eine der Herausforderungen (und Möglichkeiten) ist, dass Bazel
eine feinkörnigere Granularität von "Modulen" zulässt und davon profitiert. Zusätzliche Abhängigkeiten sind nicht transitiv in Bezug auf den Kompilierungsklassenpfad.
Ich versuche, ein Abhängigkeitsdiagramm des Codes zu erstellen und habe den Bytecode plus Heuristiken im Quellcode verwendet (für Konstanten, Importe usw.), bin aber auf einen Randfall gestoßen, von dem ich befürchte, dass es nur sein kann mit einem Compiler-Plugin gelöst.
Gegeben eine Methode Foo
in der Klasse Concrete
, die eine Schnittstelle SomeInterface
akzeptiert, die ParentInterface
erweitert, dann benötigt javac
sowohl SomeInterface
als auch ParentInterface
im Kompilierklassenpfad, obwohl ParentInterface
nicht erscheinen im Bytecode oder im Quellcode.
Dies wird in Maven
gelöst, da die Abhängigkeiten in Bezug auf compile classpath transitiv sind, aber ich möchte das vermeiden, da dies den Klassenpfad (hauptsächlich interessant in Bezug auf Quellabhängigkeiten und Build Triggerung).
Ich versuche zu sehen, ob ich Compiler-Plugins , um alle Klassen zu identifizieren, die der Compiler für eine bestimmte Quelldatei benötigt. Dies wird mir helfen, da ich meine Maven Build einmal ausführen kann, um die Informationen zu sammeln und dann das Diagramm aus dieser Info zu generieren. Problem ist, dass ich in Bezug auf die APIs ein wenig verloren bin.
Danke!
Nun, die Frage, welche Klassen zur Kompilierung benötigt werden, ist transitiv. Also, keine Möglichkeit, dies auf einem nicht-transitiven Abhängigkeitssystem abzubilden, es sei denn, Sie ziehen alle im selben Modul.
Am Ende steht ein Graph, wo Knoten eine Klasse sind und eine Kante zwischen A und B zeigt, dass A in B verwendet wird. Nun muss jede Klasse, die von A aus erreichbar ist, in einer Abhängigkeit von A stehen in der Lage sein, Module als verbundene Teilgraphen zu bauen.
In Ihrem Beispiel analysieren Sie nach der Analyse von Concrete SomeInterface und analysieren dann ParentInterface. Sie erstellen das Diagramm der direkten Abhängigkeiten, während Sie gehen, und berechnen transitive Abhängigkeiten selbst.
Wenn Sie die Transitivität selbst auflösen, müssen Sie nur die Byte-Code-Analyse (z. B. über ASM) durchführen, um die benötigten Klassen zu finden. Die einzige Abhängigkeit, die beim Kompilieren verloren geht, ist ein unbenutzter Import, der entfernt werden kann (und viele Java-Style-Guides sagen sogar, dass er entfernt werden muss).
PS: Ohne Bazel zu kennen, klingt das so, als würdest du Wege zu kleinen Modulen finden.
Tags und Links compilation java plugins bytecode