是否有技术原因可以避免在大型Java项目中创建高度复杂的包依赖关系



我是现代Java编译器和虚拟机的新手,所以我很好奇,随着包依赖关系的混乱,大型Java项目(5000多个相当大的类)在编译和运行时会遇到什么技术问题?

在大型C++项目中,如果您远离大型项目中的非循环库(或包)依赖关系图,您可能会遇到技术问题(所有可维护性问题除外)。

的一些例子

  • 如果包含大部分源树,编译可能会耗尽内存
  • 如果包含太多的对象档案,链接也可能发生(对象档案通常与C++项目中的包相关)

内联模板实例化大大加剧了这个问题。现代工作站不具备编译和链接项目的能力,该项目在构建的任何阶段都会将5000个大型类中的大多数集合在一起。

我询问过的Java开发人员不认为技术限制是避免循环包依赖性的原因(其他动机也适用)。有吗?

  1. Java编译器(javac)不是同时编译所有类,而是一个接一个地动态发现未编译或过时的.class文件。

  2. 没有链接。相反,所有.class文件在编译后被打包在一个jar文件中。这基本上是一个ZIP压缩,甚至不需要这个步骤。

  3. 由于语言语法和语义简单,Java编译器相当简单。没有太多的元编程、类型推理等。例如,Scala编译器的速度要慢得多,因为语言本身要复杂得多。

话虽如此,我找不到编译大型复杂项目的任何技术限制。显然,构建时间会增加,一旦超过10分钟,就会变得很痛苦,但这并不是一个真正的问题。

纠缠、循环、交叉引用的真正问题是源代码的可维护性。主要是重构代码要困难得多。一旦项目达到一定规模(5000多个类可能约为50万LOC),开发人员就会尝试将其拆分。提取库、模块和图层。如果依赖关系如此之强,那么这个过程几乎是不可能的。

在Java中真的没有包依赖性这回事。只有类(和接口)依赖关系。在Java中导入包时,您只是告诉编译器如何解析名称(因此不需要完全限定您使用的每个类或静态导入名称)。

数千个类之间的循环依赖关系可能会让编译器屈服。

最新更新