列出编译期间java编译器需要的所有类

Itt*_*tai 8 java plugins bytecode compilation

TL; DR
我正在寻找javac插件API,它允许我记录Java编译器为特定源文件所需的所有类.

更多的背景:
我正在写一个工具,从迁移MavenBazel所面临的挑战(和机会),一个在那儿是Bazel允许,并从的"模块"更细的粒度粮效益.另外,依赖关系对于编译类路径是不可传递的.

我试图构建代码的依赖关系图和已经使用的源代码字节码加上启发式(常量,进口等),但无意中发现了,而我害怕,只能通过使用来解决边界情况编译器插件.

给定的方法Foo中类Concrete,它接受的接口SomeInterface,其延伸ParentInterface然后javac需要两个SomeInterfaceParentInterface在编译类路径虽然ParentInterface在字节码或在源代码中不出现.

这是Maven因为依赖关系对编译类路径传递的,但是我想避免这种情况,因为这极大地扩展了类路径(主要是关于源依赖性和构建触发的有趣).

我试图看看我是否可以使用编译器插件来识别编译器对给定源文件所需的所有类.这将对我有所帮助,因为我可以运行我的maven构建一次以收集信息,然后根据此信息生成图表.问题是我对API有点失落.

谢谢!

Ale*_*lex 0

那么,编译需要哪些类的问题是传递性的。因此,无法将其映射到非传递依赖系统上,除非将它们全部拉入同一个模块中。

你最终得到的是一个图,其中节点是类,A和B之间的边描述了A在B中使用。现在从A可到达的每个类都需要依赖于A。你应该能够将模块构建为连接的子图。

因此,对于您的示例,在分析 Concrete 之后,您分析 SomeInterface,然后分析 ParentInterface。您可以随时构建直接依赖关系图,并自行计算传递依赖关系。

当您自己解决传递性时,除了字节码分析(例如通过 ASM)即可找到所需的类之外,无需执行任何操作。编译中唯一会丢失的依赖项是未使用的导入,可以将其删除(许多 java 样式指南甚至说必须将其删除)。

PS:在不了解 bazel 的情况下,这听起来像是您正在为小模块开辟道路。