Java 9引入的模块系统为什么那么复杂?
- 4 个点赞 👍
模块化复杂啥?
翻来覆去就是一个module-info.java
然后找到对应的关系,最常用的无非就是exports 和 requires
然后如果允许对方用反射访问,就用opens
如果做了服务,就用provides...with和uses,需要配合package-info.java
大多数时候记住前两条就行了,对jar做服务,这个也是进阶技能,会的人不多
写的时候,idea会帮忙自动补全,又不是vi写码,现在写个java,谁还不会用个ide啥的
其他的,unnamed之类的,这些不看也罢,遇到提示了再查都不迟
翻来覆去其实就是一个exports和requires,再加一个opens,而且并不推荐使用opens,往往是偷懒时候才用,比如自己定义一个模块,起好名字了
又不想写太多exports,怎么办呢?直接在module前面加open,让整个模块open,完事
我在群公告中,也就跟新人讲了如何open整个模块,其他也没说,也没去解释什么叫unnamed模块

没看出来复杂在哪里,用起来简单的一笔,总共就三行,其中大部分是idea帮我写的
大多数新人在我的公告指导下,根据idea的向导提示,大概5分钟就建好项目模版,开始写了
这是我公告全文:
通过IDEA向导新建的JavaFX项目是模块化项目,所以模块描述文件:module-info.java里面会有相应的权限控制,对于萌新而言,建议删除exports和opens部分,然后再在module前面加上open,开放整体项目权限,方便学习 否则会导致无法访问某些特定文件夹(例如自建的resources/images等情况发生) 修改后的module-info.java如图所示
我写fxgl游戏,都是5分钟开始写,如果超过5分钟还没开始写,那我就会过来问,你有什么困难?是网络太慢了,还是你找不到jdk在哪里下载?比如http://injdk.cn是你的好朋友,我们写代码都是随便去三线城市找个正常智商毕业的懂java的大学生就可以搞了
除了unnamed模块,以后还有unnamed package和class[1],如果不想用unnamed,那就把这些文件写全,unnamed是给那些学生用的,工作中,都要写清楚
这些都是地址,java的模块名和包名都有命名规律,就跟地址一样,如果你所在的公司叫mycompany
那么,包名模块名一定是以com.mycompany.开头,这样当你把你要分享的程序发布到网络上(maven仓库中)的时候,就不会跟其他人发布的东西相冲突
但是学生学习的时候,写点demo代码,这些可以不写,也就是unnamed
所以你非要去看那些平常用不到的内容,当然麻烦
java里面平常不用的东西多得去了,awt和swing就是两大块,还有java 2d,3d,有几个人对这些熟悉的?但是官方文档如果要写,肯定要写全,但是多数人用,也就用个常用的功能
这个世界大得很,不是初中物理,你不可能指望你在学习阶段就把所有可能遇到的情况全部囊括在内,maven仓库上3600多万个jars,谁有办法全部记下来?
都是用的时候再看,平常不用就不看
但是常用的功能,也就那么点,我到现在也就用了exports,requires和opens,就犹如maven仓库中3600多万个依赖,我就用了fxgl和javafx还有jackson几个依赖,能解决问题就行了,但是我不用的依赖,并不代表它没有存在的意义,总有人用
然后解释一下spring和模块化
spring不做模块化有几个原因,一个原因是,现在多数服务器端框架,都在忙着搞native image,所以他们没有足够的人手搞模块化
因为像spring这样的庞然大物,发展历史悠久,所以依赖了很多类库
模块化有一个要求,就是要所有已经依赖的库,都完成了模块化之后,才能进一步模块化
而spring依赖的一个常见库是netty,netty也面临着同样的问题
他们没有足够的人手去搞模块化,他们也面临着模块化和native image冲突的问题
那netty和spring都选择了,先搞native image,然后再来考虑模块化
但是依赖比较少的库,比如jackson,kotlin,都已经早早完成了模块化
然后到今年,去年完成模块化的是一些搜索引擎,比如lucene,solr和elastic search这几个
而spring等大型框架必然是最后一个完成模块化的项目
因为只有spring依赖其他项目,很少有其他项目再反过来依赖spring的
spring已经封装得够上层了,当然如果你有项目,比如国产的一些基于spring的封装的项目
那么这种项目如果要做模块化,也要等spring完成之后,才能推进
所以这就是一个逐层推进的过程,没有那么快,java世界太大了,参与人数太多,很多事不是一蹴而就的,这个就像我跟他们解释说,一些大型的国企,他们要推进产品升级,比如数据库升级
那么这个过程肯定不是一蹴而就的,而是一个漫长,跨度可能高达几年的过程
spring应用如此广泛,所以这个推进也一定是很漫长的,但是这个趋势是不会变的
那如果你等不了怎么办?
找替代
据我所知,helidon和nima就在积极滋磁模块化
helidon是spring的替代,nima是netty的替代
他们的计划是今年年底,21虚拟线程发布之后,就跟着发布,所以你如果不想等,那就用helidon和nima
其他的主要框架,比如micronaut,quarkus都还没有明确的模块化的计划,都在集中力气搞aot也就是native image
最后说一下目前模块化主要应用
模块化做出来,是针对sdk,也就是jdk的
如果你对jdk的标准包不满意,想替换,那么模块化是必然产物
否则你就要去修改jdk源码,并将其重新编译,我不认为多数人有那个本事
jdk标准包包括:gui(awt和swing),编译器前端(javac)后端(jvm),xml处理工具等等
那么
kotlin就是替换了前端,javac -> kotlinc
javafx就是替换了gui,awt/swing -> javafx
那根据 的消息,说啊,graal打算把polyglot的部分全部模块化,并发布到maven仓库上去,并淘汰现有的命令行工具gu
这些东西,对于java基础都没学清楚的人来说,属于进阶技能
如果你连maven/gradle这些都没搞清楚,我不认为你有能力搞这些东西
也没必要,因为大多数包都是针对java标准包的,maven仓库中最多的就是针对java标准包的依赖,然后是安卓
这些包不需要你修改sdk也就是jdk就能用
但是存在有需要你修改sdk才能用的包,比如javafx,那么如果你想用这些依赖
就需要配合模块化使用,这些东西都自动化了,intellij idea社区版就有向导帮忙生成这种项目模版
照着向导做就是了,用的时候知道是怎么回事就行了,这又不是造火箭
有手就行,多得是人搞得好好的
要是实在搞不懂,找个安卓开发来手把手教
安卓开发工具比java的复杂,安卓开发这些都懂
懂gradle的不可能不懂maven
懂安卓的,不可能不懂java
参考
发布于 2023-07-07 23:39・IP 属地广东真诚赞赏,手留余香还没有人赞赏,快来当第一个赞赏的人吧!查看全文>>
圆胖肿 - 1 个点赞 👍
先说结论,我承认可能是没学明白这玩意,目前还是认为这玩意收益没有把应用迁移到SpringNative高。
这玩意直到现在都有点意义不明,定义的很奇怪且不好用。
你要是想拿来做点东西,会发现各种库有问题(尤其是国内喜欢阿里出品,那更是一坨)。java目前的生态看起来很大,但是很多工具的核心思路都是反射。这你怎么用,到处底层的包都有可能因为反射的问题在运行时挂掉。
就算是用了收益也不大,对于目前主要用来做服务,大点的公司走cicd,感知不强。小点的公司不说测试能不能测出来潜在的问题,业务都做不完哪来的时间裁剪jdk和依赖省那百十兆硬盘。至少没觉得产生了什么实际价值。
还不如看看怎么把应用升级到Native。况且目前SpringNative的路子应该也不太需要这玩意了。反正因为反射要跑起来确定运行时加载的类之后才打包,更没有封模块的动力了。
编辑于 2023-07-07 19:56・IP 属地陕西查看全文>>
只难 - 0 个点赞 👍
查看全文>>
陈小一.Wizcas - 0 个点赞 👍
Java 9 引入的模块化系统是为了解决 Java 应用程序日益复杂的依赖关系和版本管理问题而设计的。模块化系统可以将大型应用程序划分为更小、更易于管理的模块,并通过清晰的依赖关系和版本控制来确保模块之间的协作和兼容性。
然而,这种新的模块化系统也带来了一些复杂性。其中一个原因是因为模块化系统需要对现有的类加载器和模块路径进行重构和重新设计。这些更改不仅需要对 Java 平台本身进行修改,还需要对开发者的工具链和代码库进行修改。因此,Java 9 的模块化系统引入了一些新的概念和语法,例如模块描述文件(module-info.java)、模块路径、模块化 JAR 文件等,这些概念需要开发者进行学习和掌握。
另外,Java 9 的模块化系统还需要开发者对其应用程序进行重新设计和重构,以适应新的模块化系统。这可能需要开发者进行大量的代码修改和重构工作,可能会给开发者带来一些困扰和挑战。
综上所述,Java 9 的模块化系统引入了一些复杂性,但这些更改是为了解决 Java 应用程序日益复杂的依赖关系和版本管理问题。虽然这些更改可能会给开发者带来一些挑战,但它们最终将使 Java 应用程序更加健壮、可维护和可扩展。
发布于 2023-07-07 20:20・IP 属地北京查看全文>>
今天原谅你 - 0 个点赞 👍
模块其实也还好,算不上复杂,如果从系统类库来看,其只是拆分的Javase本身。其他的jsr都是通过自己去引用完成的(其实有一部分确实拆分得比较彻底,都不在se里了,直接变成自己去引用了)。拆分javase本身也是解决javase太臃肿的问题。另一个目的就是解决外部API和内部实现都在一起的一系列问题。如果是业务开发,一般不用太关注这玩意。
发布于 2023-07-07 19:22・IP 属地塞浦路斯查看全文>>
冥道小月 - 0 个点赞 👍
理解和掌握Java 9引入的模块系统确实需要一定的学习成本,尤其对于那些习惯了传统Java开发方式的开发者来说,可能会觉得它复杂和繁琐。模块系统的设计目的是为了解决Java平台在模块化方面的一些问题,例如依赖管理、可靠性、性能等,并提供更好的模块化支持。
模块化的复杂性是为了满足各种需求和场景的灵活性,并提供更高级别的模块化抽象。它允许开发者定义模块之间的依赖关系、访问控制和可见性,以及提供细粒度的模块化粒度。这样做的好处是可以更好地管理复杂的代码库、提供可重用的模块、隔离依赖关系和实现更高效的运行时。
相比于一些其他编程语言,Java的模块系统可能看起来更为复杂,但这是因为Java本身的生态和历史原因。Java在发展过程中积累了大量的库和代码库,具有广泛的应用范围和复杂的依赖关系。为了保持向后兼容性并为现有代码库提供模块化支持,模块系统需要考虑各种复杂的情况。
同时,Java的模块系统也是为了满足未来的发展需求和技术趋势,如云计算、容器化和微服务架构等。它提供了更灵活、可扩展和安全的模块化解决方案,以满足日益复杂的软件开发和交付需求。
虽然学习和理解Java模块系统可能需要一些时间和努力,但它为Java开发者带来了许多潜在的好处,包括更好的可维护性、可扩展性和可重用性。
-From ChatGPT
发布于 2023-07-09 01:14・IP 属地美国真诚赞赏,手留余香还没有人赞赏,快来当第一个赞赏的人吧!查看全文>>
Roc W