Java 模块化Modularity- 了解与测试

1.  java9后JDK后目录的变化

不见了jre,新增了jmods目录。

 1)为什么不见了jre?

新版JDK提供了 jlink工具,使用它构建一个包含jre镜像的应用程序。 就是可以打包一个引用程序内部已经包含完整或部分jre,可以直接运行。

2)我们都知道rt.jar文件是java的基础类库,那rt.jar去哪里了?

rt.jar在java9后被拆分并采用模块化的方式被打包成了一个个.jmod文件(${JAVA_HOME}/jmods目录下)。如下:

 3)为什么要拆rt.jar呢?

1.rt.jar文件的大小超过了60M(java8)。

2.模块化以后也更适合构建jre镜像的应用程序,可以根据选择需要的jre模 块,而不必打包全部jre。

2. java模块化的理解

一、 提供了一种新的代码组织方式。

如图我们将代码文件打包成一个一个jmod,服务提供方控制接口的暴漏规则,而 服务消费方通过类似依赖引入。具体下一节我们具体操作一下。

二、 提供了一种新的代码权限级别,增强了代码权限控制。

1、java原有的文件代码权限如下:

public:表示紧跟其后的成员可以被任何人引用

private:表示紧跟其后的成员除了类型创建者和类型内部的方法,任何人都不可引 用,否者程序编译报错

protected:表示子类访问权限,同包中的可以访问,即使不同包,但是有继承关系,也 可以访问.

默认访问权限(即定义属性时不加任何关键字修饰):默认访问权限通常被称为 “包访问权限”,在这种权限下的成员变量可被同一个包中的其他类访问

2、模块化的代码权限控制我们通过以下模块提供的两个指令就能看出:

(1)exports 和 exports to 指令

exports 指令用于指定一个模块中哪些包对外是可访问的,而 exports…to 指令则 用来限定哪些模块可以访问导出类,允许开发者通过逗号分隔的列表指定哪些模 块及模块的哪些代码可以访问导出的包。

(2) provides…with 指令

该指令用于说明模块提供了某个服务的实现,因此模块也称为服务提供者。 provides 后面跟接口名或抽象类名,与 use 指令后的名称一致,with 后面跟实现 类该接口或抽象类的类名。

备注:java 模块暂不支持对对版本的管理。

3. 提供模块间依赖的管理

执行如下指令,显示该模块的引用与输出:

java -d java.logging

4. 打包jre镜像程序,可以任意运行

java模块的语法

  • [open] module <module>:

    声明一个模块,模块名称应全局唯一,不可重复。加上 open 关键词表示模块内的所有包都允许通过 Java 反射访问,模块声明体内不再允许使用 opens 语句。

  • requires [transitive] <module>:

    声明模块依赖,一次只能声明一个依赖,如果依赖多个模块,需要多次声明。加上 transitive 关键词表示传递依赖,比如模块 A 依赖模块 B,模块 B 传递依赖模块 C,那么模块 A 就会自动依赖模块 C,类似于 Maven。

  • exports <package> [to <module1>[, <module2>...]]:

    导出模块内的包(允许直接 import 使用),一次导出一个包,如果需要导出多个包,需要多次声明。如果需要定向导出,可以使用 to 关键词,后面加上模块列表(逗号分隔)。

  • opens <package> [to <module>[, <module2>...]]:

    开放模块内的包(允许通过 Java 反射访问),一次开放一个包,如果需要开放多个包,需要多次声明。如果需要定向开放,可以使用 to 关键词,后面加上模块列表(逗号分隔)。

  • provides <interface | abstract class> with <class1>[, <class2> ...]:

    声明模块提供的 Java SPI 服务,一次可以声明多个服务实现类(逗号分隔)。

  • uses <interface | abstract class>:

声明模块依赖的 Java SPI 服务,加上之后模块内的代码就可以通过 ServiceLoader.load(Class) 一次性加载所声明的 SPI 服务的所有实现类。

5. java模块的例子

该例子用来让您尽快对java模块的功能和使用场景有一个认知。

1)新建一个maven项目,名字是JmoduleTest 。 

2)编写main.java

package org.example;public class Main {public static void main(String[] args) {System.out.println("Hello world!");}
}

3) 创建module-info.java 类,并且依赖java.base, java.logging。 java.base默认就有。

4) 将模块信息和类编译后放入bin目录下

javac -d bin src/module-info.java src/main/java/org/example/*.java

 5) 创建demo.jar,并指定主类和编译class

jar --create --file demo.jar --main-class org.example.Main -C bin .

打包后,生成demo.jar文件

 6 ) 创建模块

jmod create --class-path demo.jar demo.jmod

之后会生成demo.jmod。

 7) 运行demo

java --module-path demo.jar --module JmoduleTest

运行结果是:

8 ) 创建jre镜像

#--module-path参数指定了我们自己的模块hello.jmod,然后,在--add-modules参数中指定了我们用到的3个模块java.base、java.xml和hello.world,用逗号分隔。最后,在--output参数指定输出目录。

jlink --module-path demo.jmod --add-modules java.base,java.logging, JmoduleTest --output jre

 

9 ) 执行镜像

#我的是window是环境下,执行生成jre中的java命令

.\jre\bin\java --module JmoduleTest

 10 ) 查看模块信息

./jre/bin/java -d JmoduleTest

 

参考资料

Understanding Java 9 Modules | Oracle United Kingdom

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/14309.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MP的开发流程

MP的开发流程 1、添加依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.ap…

【李宏毅 DLHLP 深度学习人类语言处理 HW1】

李宏毅 DLHLP 深度学习人类语言处理 HW1 相关资料HW1更多尝试1, 加深encoder:4层LSTM2, 加深encoder(4层LSTM)和加深decoder(2层LSTM)3, cnn代替vgg4, 再次加深decoder(4层LSTM) 语音小白在网上没有找到这门课的作业分享&#xff0c;那就记录一下自己的作业吧。 相关资料 课程…

4. 深度生成模型-扩散模型(基于扩散的生成模型与分数匹配的变分视角)

“基于扩散的生成模型”与“分数匹配”的变分视角 1. 介绍1.1. 变分自动编码器1.2. 基于扩散的建模1.3. 主要内容2. 基于得分的随机微分方程生成建模基于离散时间扩散的生成模型和分数匹配方法在高维图像数据建模方面显示出了良好的效果。 最近,Song等人(2021)表明,通过学…

基于SpringBoot+Vue的学习平台设计与实现(源码+LW+部署文档等)

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

小程序使用echarts

参考文档&#xff1a;echarts官网、echarts-for-weixin 第一步引入组件库&#xff0c;可直接从echarts-for-weixin下载&#xff0c;也可以从echarts官网自定义生成&#xff0c;这里我们就不贴了组件库引入好后&#xff0c;就是页面引用啦&#xff0c;废话不多说&#xff0c;直…

tinkerCAD案例:23.Tinkercad 中的自定义字体

tinkerCAD案例&#xff1a;23.Tinkercad 中的自定义字体 原文 Tinkercad Projects Tinkercad has a fun shape in the Shape Generators section that allows you to upload your own font in SVG format and use it in your designs. I’ve used it for a variety of desi…

Ansible最佳实践之Playbook使用过滤器处理网络地址

写在前面 使用过滤器检查、验证和操作包含网络信息的变量理解不足小伙伴帮忙指正 傍晚时分&#xff0c;你坐在屋檐下&#xff0c;看着天慢慢地黑下去&#xff0c;心里寂寞而凄凉&#xff0c;感到自己的生命被剥夺了。当时我是个年轻人&#xff0c;但我害怕这样生活下去&#xf…

Blazor前后端框架Known-V1.2.8

V1.2.8 Known是基于C#和Blazor开发的前后端分离快速开发框架&#xff0c;开箱即用&#xff0c;跨平台&#xff0c;一处代码&#xff0c;多处运行。 Gitee&#xff1a; https://gitee.com/known/KnownGithub&#xff1a;https://github.com/known/Known 概述 基于C#和Blazor…

Linked List

文章目录 链表定义专业术语代码链表分类常见算法链表创建和常用算法 链表总结 链表 补充知识 typedef 给类型换名字&#xff0c;比如 typedef struct Student {int sid;char name[100];char sex; }ST;//ST就代表了struct Student //即这上方一大坨都可以用ST表示 //原先结构体…

Springer独立出版 | 2023年触觉与虚拟现实国际会议(ICHVR 2023)

会议简介 Brief Introduction 2023年触觉与虚拟现实国际会议(ICHVR 2023) 会议时间&#xff1a;2023年12月15日-17日 召开地点&#xff1a;中国北海 大会官网&#xff1a;www.ichvr.org 2023年触觉与虚拟现实国际会议(ICHVR 2023)由东南大学、上海交通大学联合主办&#xff1b;…

通过String字符生成base64编码

* base64转图片 //对字节数组字符串进行Base64解码并生成图片 * param base64str base64码 * return // param savePath 图片路径private static final String savePath"image_ver\\verifyCode"; 判断是否为base64编码 public static void mainDD…

PHP使用Redis实战实录4:单例模式和面向过程操作redis的语法

PHP使用Redis实战实录系列 PHP使用Redis实战实录1&#xff1a;宝塔环境搭建、6379端口配置、Redis服务启动失败解决方案PHP使用Redis实战实录2&#xff1a;Redis扩展方法和PHP连接Redis的多种方案PHP使用Redis实战实录3&#xff1a;数据类型比较、大小限制和性能扩展PHP使用Re…

ajax概述

目录 1.什么是ajax 2.ja原生ajax 3.jQuery框架的ajax 4.综合案例 1.什么是ajax Ajax 即"Asynchronous Javascript And XML"&#xff08;异步 JavaScript 和 XML&#xff09;&#xff0c;是指一种创建交互式网页应用的网页开发技术。Ajax 异步 JavaScript 和 XML&…

多线程(JavaEE初阶系列5)

目录 前言&#xff1a; 1.什么是定时器 2.标准库中的定时器及使用 3.实现定时器 结束语&#xff1a; 前言&#xff1a; 在上一节中小编给大家介绍了多线程中的两个设计模式&#xff0c;单例模式和阻塞式队列模式&#xff0c;在单例模式中又有两种实现方式一种是懒汉模式&a…

初识TDMQ

目录 一&#xff1a;需求背景二&#xff1a;相关文档三&#xff1a;验证TDMQ广播消息 一&#xff1a;需求背景 目前公司需要将决策引擎处理的结果&#xff0c; 一部分数据交给下游分析/入黑/通知等功能。因此就需要决策引擎生产结果让多方下游去消费。 而我需要实现下游的一部…

微信小程序转抖音小程序的坑:The component <xxx> used in pages/xxx/xxx is undefined

微信小程序组件定义在根目录的 app.json 中了&#xff0c;在抖音小程序中出现找不到的情况。 在需要用到组件的 pages 目录中页面文件夹的 json "usingComponents": {} 大括号中添加页面使用的组件&#xff0c;即可使用...

STM32使用HAL库BH1750光照度传感器

开发环境 单片机&#xff1a;STM32F103C8T6 光照度传感器&#xff1a;BH1750 IDE&#xff1a;KEILSTM32CUBEMX 单片机配置 1、STM32CUBEMX BH1750代码 1、头文件 /* ************************************************* BH1750光照数据计算&#xff08;LUX&#xff09; …

Shell脚本实现分库分表操作

目录 一&#xff0c;分库备份 二&#xff0c;分库操作 三&#xff0c;分库分表备份 四&#xff0c;备份还原 一&#xff0c;分库备份 #!/bin/bash mysql_cmd-uroot -pzly666666 bak_path/backup/db [ -d ${bak_path} ] || mkdir -p ${bak_path}mysql ${mysql_cmd} -e show…

操作系统期末总复习结构

目录 前言 操作系统引论 操作系统的目标 操作系统的基本特征 操作系统的主要功能 系统调用的基本概念 进程的描述与控制 进程和程序的区别 程序为什么不能并发执行&#xff08;引入进程的原因&#xff09; 进程的基本状态与转换 进程通信的类型 线程的概念以及与进程…

解决Django报错 : No module named ‘MySQLdb‘

Django的版本是2.0&#xff0c;Python的版本号是3.6.4 在models.py创建好了模型类之后使用命令&#xff1a;python manage.py makemigrations 进行迁移&#xff0c;但是突然报错&#xff1a;ImportError:No module named MySQLdb 查询了相关资料发现python2.x版本是支持mysql…