欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JAVA 9模块系统(一)

程序员文章站 2024-01-11 20:50:16
...

    在JAVA 9之前,我们会遇到一些JAR相关的问题:有些是缺少相关依赖,有些是存在多个版本,这可能导致功能错误,甚至是系统的崩溃。对开发者来说,我们很容易理解各个JAR有自己的标识,组件之间存在依赖。但是对JAVA来说,JAR包只是一系列的Class文件,不能描述JAR包的属性。

    JAR依赖发生的错误,在复杂的系统中可能会遇到。 常见的如:

    1. NoClassDeffFoundError 这个发生在JVM执行相关依赖的代码。找到缺失的依赖比较容易,但分析缺少的原因可能需要相对困难。 一般我们通过工具,生成依赖图,再来找出运行时缺少相关依赖的原因。

    2. Shadowing 这个只不同的JAR包,存在相同的命名(package + class name). 这种情况比较少见。在项目有一次遇到。在测试环境,出现JVM找不到Object的方法,但是在本地环境确不能重现。后来发现,在不同的JAR包存在相同的命名,而本地与测试环境加载jar包的顺序不一样,所以表现出不同的效果。

    3. 版本冲突 这个比较常见,我们往往引入依赖JAR包,这个会引入其它依赖。可能会出现对同一个JAR包,出现多个版本。一般来说编译工具会优化这个问题,警告我们存在多个版本,选择最新的版本使用。

    4. 模块的弱封装 如果依赖的某个JAR包,跨越package的边界,是是否定义为public。这可能导致虽然我们某些功能定义为public, 但是确是为模块内部使用,不应该为其它的JAR包调用,但是在JAVA9出现前不能从技术上根本解决这个问题。

    5. 启动的性能 许多应用程序,比如使用spring, 在启动的时候回消耗许多时间。JVM虽然class为lazy load, 但是当需要一个class时,需要知道这个class是在哪个JAR包。所以,启动的时候一般需要执行JAR包的扫描,以确保知道对应的class路径。

    6. JRE裁剪 如果你应用程序,不需要Swing, SQL, XML, 能裁剪这些代码吗?JAVA 8 定义JRE三个模块的子集,但是这些是固定的,不能动态调整,并不能满足对JRE部分裁剪的需求。

    后面的文章,我们将讲述JAVA 9如何解决这些问题。最主要的,JAVA 9在设计理念上将影响我们,让大家更加注重模块图,更加注重模块之间的依赖管理。