Auflisten aller Klassen, die der Java-Compiler während der Kompilierung benötigt

8

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!

    
Ittai 11.09.2016, 06:43
quelle

1 Antwort

0

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.

    
Alex 10.10.2016 18:17
quelle

Tags und Links