课程咨询 :186-8884-0703
咨询QQ:1615412715

深圳Java培训 > 达内新闻 >  JAR 地狱问题能够靠Jigsaw 项目吗?
  • JAR 地狱问题能够靠Jigsaw 项目吗?

    发布:深圳Java培训      来源:达内新闻      时间:2016-01-04

  • JAR地狱问题

    JAR地狱存在着如下循环问题:

    表述不清以及传递性依赖

    遮蔽

    版本冲突

    复杂的类加载

    深圳达内JAVA培训中心的老师认为,根据构建工具与组件系统(JDK开发者称之为容器)为我们所带来的诸多功能与特性,我们可以认为表述不清以及传递性依赖问题已经在很大程度上得到了 解决,遮蔽问题至少得到了缓解,而复杂的类加载也不再是老生常谈的问题了。这样,版本冲突就成为JAR地狱中最为严重的一个问题了,它影响到了很多很多项 目每天的更新决策。

     JAR 地狱问题能够靠Jigsaw 项目吗?

    Jigsaw将会带来哪些改变?

    深圳达内JAVA培训中心的老师认为,之前曾就Jigsaw项目会为Java 9带来哪些新特性专门写过文章进行过介绍,不过这里将从不同的视角进行阐述。首先,它会受到当前的早期访问构建版的影响;其次,我们这里只从与JAR/模块地狱相关的角度进行介绍。

    Jigsaw为Java带来的核心概念就是模块化。简而言之,模块就像JAR一样,同时带有一些附加信息与特性。这些信息包含了模块的名字以及模块所依赖的其他模块的名字。

    依赖

    当编译器与JVM在处理模块时,他们会解析这些信息。在编译或启动时,他们会通过模块路径传递性解析所有依赖。总体来说,这类似于类路径扫描,不过 现在寻找的是整个模块而非单个类,对于JVM来说,这是在启动期而非运行期进行的。如果在模块路径上无法找到所有依赖,那么解析模块的传递性依赖就会失 败。这显然可以解决表述不清,以及无休止的传递性依赖的问题。我认为这是个很棒的做法,Java语言现在正式知道关于依赖的信息了,所有工具(编译器与 JVM等)都能理解这一点并正常使用!不过,我认为这并不会对开发者每天的工作产生多少积极的影响,因为现在很多既有的基础设施都已经解决这个问题了,比 如说构建工具等。

    遮蔽

    Jigsaw消除了遮蔽的问题。模块系统可以确保每个依赖都会被另一个模块所实现,每个模块都会读取至多一个模块,定义了同名包的模块之间并不会相互干扰。更准确地说,模块系统在遇到模糊不清的情况时就会终止并报错,比如说两个模块将相同的包导出到相同模块中。

    版本冲突

    深圳达内JAVA培训中心的老师认为,认为第三方库的版本冲突是JAR地狱最为难以解决的问题。最直接的解决方案就是一个模块系统能够加载同一个模块的不同版本。这需要确保这些版本 之间不存在互相交互的情况。问题在于:在单个配置中,没必要支持一个模块的多个版本。实际上,当前的构建既不会创建,也无法理解模块版本信息。曾有人使用 了一些变通办法。最丑陋,同时也是最可行的办法就是重命名出现冲突的构件,这样他们就不再是相同模块的两个不同版本了,而是两个完全不同的模块。不过,这 种做法最后证明也是行不通的。显然,确保“定义了同名包的模块之间不会相互干扰”是在两个模块导出相同包时拒绝任何启动配置来实现的。即便没有模块读取他 们亦如此!

    复杂的类加载

    模块与类加载器之间如何交互以及如何改变类加载的复杂性是个很棘手的问题。实际上,模块系统对模块与类加载器之间的关系并没有做多少限制。类加载器 可以从一个模块或是多个模块来加载类型,只要模块之间不存在相互干扰的情况,并且每个模块中的类型只由一个加载器加载即可。因此,类加载器与模块之间是一 对多的关系。

    模块地狱?

    既然依赖与遮蔽问题已经得到了解决,并且类加载问题也得到了改进,那我为何还要讨论模块地狱呢?就是因为版本冲突么?没错!如果Jigsaw想要解 决JAR地狱问题,它就需要特别注意版本冲突问题。否则,很多项目并不会出现什么起色。他们依然要面对版本冲突问题,并且会陷入到自定义类加载器的梦魇 中。

    提案

    我的提案是让开发者与构建工具能够传递一些额外的信息,这些信息能够解决一些含糊不清的问题。传递这种信息的两种常见方式是命令行与配置文件。如果 使用命令行参数,那么每次启动时都需要输入一次。根据信息的多少以及项目的规模,这种做法可能会变得非常乏味。可以通过构建工具来创建配置文件,然后再通 过命令行指定配置文件。这看起来是个不错的解决方案。目前,初始模块与所有的传递性依赖都是通过单个配置来解析的,这形成了单独的一个层次。不过,我们可 以在运行期将相同模块的多个版本加载到不同层次中,这正是组件系统要做的事情。总的来说,我的建议就是通过多个层次来显式指定配置。

    更多内容请点击【深圳JAVA培训】

上一篇:恭喜JAVA学员于*平入职南京易司拓电力科技股份有限公司

下一篇:开发者转战Spring 4的决定因素

最新开班日期  |  更多

Java--零基础全日制班

Java--零基础全日制班

开班日期:4月28日

Java--零基础周末班

Java--零基础周末班

开班日期:4月28日

Java--大数据全日制班

Java--大数据全日制班

开班日期:4月28日

Java--大数据周末班

Java--大数据周末班

开班日期:4月28日

  • 地址:深圳市宝安区共乐路西乡商会大厦10楼——深圳JAVA培训中心宝安校区
    深圳市龙岗区横岗力嘉路2013文化创客园A栋——深圳JAVA培训中心龙岗校区
  • 课程培训电话:186-8884-0703
    咨询QQ:1615412715 全国免费咨询热线:400-111-8989
  • 2001-2016 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56