是否存在技术原因以避免在大型Java项目中创建高度纠结的包依赖项?

Chr*_*tti 5 java dependency-management

我是现代Java编译器和虚拟机的新手,所以我很好奇,在编译和运行时,大型Java项目(5000多个大型类)遇到了哪些技术问题,因为包依赖关系的gordian结?

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

一些例子

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

内联模板实例化会严重加剧这个问题.现代工作站不具备编译和链接项目的能力,该项目在构建的任一阶段将大多数5000个相当大的类拉到一起.

我问过的Java开发人员不相信技术限制是避免循环包依赖的原因(其他动机适用).有吗?

Tom*_*icz 4

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

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

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

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

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