java9模块化初探
来源:互联网 发布:网络规划设计师论文 编辑:程序博客网 时间:2024/06/05 03:29
Java 9 已于 9月发布。众所周知,java 9的最大特性是引入了模块化系统jigsaw。那么为什么java要引入模块化系统?会对我们今后的开发产生什么影响,该如何正确的使用模块化系统。本文将对这些问题进行一些简单探讨。
开发一个大型应用,功能众多,逻辑复杂,把一个大型应用分解为小块,每块完成一个专有功能,是一套行之有效的化解系统复杂度的办法。应用程序中每一块可以提供单独功能的部分可以称为一个模块,比如订单管理模块,用户管理模块等。对于分布式应用,模块可以组件化,并且以service方式对外提供服务,这种情况下,组件运行在不同进程之间,类库天然隔离,模块依赖管理的变更为服务的注册,服务发现的管理,这些内容不在本文讨论之列,不再详细叙述。而对于java单体应用,模块可以放在不同的工程中进行管理并且可以打包成为单独的jar,应用发布时把这些jar包再打在一起,成为executive jar包,或者war包等等。
Java应用往往不仅仅是只基于jdk类库进行开发,还会使用大量的第三方类库,例如apache common, google guava等等,无论是用jdk自身的类库还是第三方类库,我们面临以下几个问题。
- 类库的包和类对于我们完全可见,虽然一般我们会按照文档对类库的类进行合理使用,但是并不能阻止不合理的调用,这样的使用即使暂时能够使程序运行,也会对将来的稳定性和维护性留下隐患。
- 同一个包名和类名出现在不同jar中,往往只会加载其中一个,导致程序不能正常工作。
- 引用了同一个jar不同版本出,导致程序不能正常工作。
Jigsaw基于访问控制隔离模块,可以解决第一个问题,但是对于2,3目前并没有解决办法。在Jigsaw出现之前,OSGI已经出现很多年了,OSGI通过classloader是可以解决第2,第3个问题的,OSGI已经非常成熟,其实算得上之前java模块化事实标准,至于为何另搞Jigsaw, 以及如何结合OSGI和Jigsaw,这里就不再做讨论了。Jigsaw即便目前只解决第一个问题,也是java在工程化方向一大进步,基于java9, 就可以开始模块化我们的应用,下面用一个例子进行简单说明。
假如我们在构建一个在线购物系统,我们其中有2个子系统分为订单模块和产品模块,订单模块是依赖于产品模块。我们为这2个模块创建2个project, 并且分别打包为product.jar和order.jar,order.jar 将会依赖于product.jar. 如果我们仅仅使用maven管理依赖,产品模块的所有共有类将会暴露给订单模块,比如数据库访问相关的等,这并不是我们所期望的。 作为product模块,我们需要对外暴露领域对象和服务接口,这些可以写在模块描述文件中,如下是product的module-info.java 文件。
module org.easysoft.store.product.v1 { exports org.easysoft.store.product.v1.service; exports org.easysoft.store.product.v1.domain;}
这里我们可以看出我们只导出product模块的service和domain2个包,其他的比如impl包我们并不希望其可见,这样就完成了模块之间访问控制。另外一方面,作为订单模块,我们需要依赖于product模块,如下是订单模块的module-info.java
module org.easysoft.store.order.v1 { requires org.easysoft.store.product.v1;}
基于maven, 之前我们需要添加对product jar的依赖。
<?xml version="1.0" encoding="UTF-8"?><project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.easysoft.store</groupId> <artifactId>order</artifactId> <version>0.0.1</version> <dependencies> <dependency> <groupId>org.easysoft.store</groupId> <artifactId>product</artifactId> <version>0.0.1</version> </dependency> </dependencies> <properties> <maven.compiler.target>1.9</maven.compiler.target> <maven.compiler.source>1.9</maven.compiler.source> </properties></project>
如此一来我们就可以在order包中对product的导出包进行引用,
package org.easysoft.store.order.v1;import org.easysoft.store.order.v1.domain.Order;import org.easysoft.store.order.v1.domain.OrderItem;import org.easysoft.store.order.v1.service.OrderService;import org.easysoft.store.product.v1.service.ProductService;public class OrderServiceTest { public static void main(String[] args){ ProductService productService = org.easysoft.store.product.v1.service.ServiceFactory.createProductService(); OrderService orderService = org.easysoft.store.order.v1.service.ServiceFactory.createOrderService(); Order order = new Order(); OrderItem orderItem = new OrderItem(); orderItem.setProduct(productService.findById(1L).orElseThrow(()->new IllegalArgumentException("Not valid product id."))); order.getItems().add(new OrderItem()); order.setUser("testuser"); orderService.create(order); orderService.list().forEach(System.out::println); }}
但是如果尝试直接在本类中引用非导出包的类,比如productserviceimpl,我们将得到一个错误。可以这样说,如果采用jigsaw,那就将强迫我们采用更好的设计。
- java9模块化初探
- Java9 模块化 Jigsaw 入门指引
- Java9 modules (Jigsaw)模块化迁移
- JS模块化设计初探
- seajs模块化开发初探
- 初探Javascript模块化开发
- Java9
- java9
- java9
- Java9
- JAVA9
- JAVA9
- javascript模块化、模块加载器初探
- Nginx服务器架构初探---模块化设计
- java9-String
- java9-1
- HealthInfo.java9
- StreamTools.java9
- 关于“臭美”的极致追求,你真的够了解吗?
- 百分百Match!百度地图代言人花落“国民男神”鹿晗
- 都是车载空气净化器,Calm又好在哪里?
- 官方证实 vivo成首批微信朋友圈广告投放品牌
- 最轻盈的系统:Funtouch 2.0正式版注重色彩与细节
- java9模块化初探
- “处女座”乱入微信朋友圈,商业广告第一次这么玩儿!
- 连上了WiFi,为什么还是不能上网?
- 腾讯加力支持 搜狗搜索移动客户端3.0独家再推“微信头条”
- 重装出击:手游外设时代的来临
- BUTEL:2015全球首款会议级家庭可视通讯电视盒子
- 联想云WRITEit与SHAREit双双荣获CES2015最佳奖项
- “2014-2015全球领先品牌Global Top Brands”榜单揭晓, 最大黑马【麦开】拿下“全球最佳智能健康创新大奖”
- 百修宝侯军:家电维修产业正面临一次革命