Java9模块化系统JPMS(Java Platform Module System)

news2024/9/20 4:19:34

引言

随着Java技术的发展,开发人员面临的挑战之一是如何有效地管理和组织大型项目的依赖关系。传统的类路径(classpath)方法虽然简单,但在大型项目中却难以管理,尤其是在面对复杂的依赖关系时。为了解决这些问题,Java 9引入了Java Platform Module System(JPMS),也称为Jigsaw项目。本文将探讨JPMS产生的原因、解决的问题以及其实现原理,并通过示例演示如何使用JPMS。

JPMS产生的原因

在JDK8以及之前的版本,我们安装的时候会安装两部分内容

JDK(Java Development Kit)主要用于开发者提供了开发工具和环境
JRE(Java Runtime Environment)主要提供Java运行时环境

JDK是开发Java应用的完整套装,而JRE则是为了支持已编译的Java程序在任何计算机上运行而设计的环境。JDK内部包含了JRE,以方便开发者在开发的同时也能直接运行和测试他们的代码

在jre/bin目录下有一个rt.jar文件,表示的是runtime,即运行时。JVM会加载这整个文件来支持Java运行时环境,而rt.jar文件的大小已经达到50-60M,也就是说在运行你的Java程序之前,就需要花这么多内存来加载Java运行时环境,我们来看看rt.jar中包含哪些内容

我们使用解压工具打开rt.jar可以清晰的看到,里面包括的内容很全,基本上包括了Java的方方面面,都给你加载进去了。就算你只写一个HelloWord,它也给你加载了Applet、awt等你根本不会用到的东西。现在的服务器和个人电脑随便都是8G、16G以上的内存,对于rt.jar占用的这点内存可能没什么感觉,但在一些对于内存很敏感的领域,Java这种方式就显得不太合理。Java官方可能也意识到了这个问题,所以在Java9的时候推出了Java平台模块系统(Java Platform Module System,JPMS)

解决的问题

JPMS解决了上述提到的问题,其实核心思路就是按需加载,具体来说:

  1. 清晰的依赖管理:通过明确的模块依赖声明,开发人员可以轻松地管理项目的依赖关系。
  2. 增强的封装:模块之间默认不可见,只有通过明确的导出声明才能访问其他模块的公共API。
  3. 提高安全性:限制对内部API的访问,增强了系统的安全性。
  4. 更好的性能:模块化应用程序可以更快地启动,因为Java运行时只需要加载所需的模块。

JPMS原理介绍

模块

模块是JPMS的基本单位。每个模块都有自己的命名空间,并且可以通过模块描述文件(module-info.java)来声明模块的依赖关系和其他元数据。

模块描述文件

每个模块都有一个特殊的源文件module-info.java,其中包含了模块的元数据,如模块名称、导出的包、依赖的其他模块等。

模块路径

在Java 9及之后的版本中,引入了模块路径(module path),用于指定模块的位置。模块路径可以包含多个模块,每个模块都可以包含多个包。

模块之间的可见性

模块之间默认是不可见的,这意味着一个模块不能直接访问另一个模块的内部细节。为了使一个模块的包对其他模块可见,需要使用exports关键字来导出这些包。同样,使用requires关键字来声明一个模块依赖于其他模块。

自动模块

在Java 9中,位于类路径上的非模块化代码被称为“自动模块”。自动模块默认是可见的,但只能访问其他模块公开的部分。

模块层次结构

模块之间可以形成层次结构,通过依赖关系连接起来。根模块(通常为java.base)是所有其他模块的基础,它包含了Java核心类库。

示例

假设我们有两个模块:com.example.mylibrarycom.example.app

模块 com.example.mylibrary

  • module-info.java:
    module com.example.mylibrary {
        requires java.base;
        exports com.example.mylibrary.api;
    }

模块 com.example.app

  • module-info.java:
    module com.example.app {
        requires com.example.mylibrary;
        requires java.base;
        exports com.example.app;
    }

示例代码

com.example.mylibrary 中的代码
  • com/example/mylibrary/api/MyLibrary.java:
    package com.example.mylibrary.api;
    
    public class MyLibrary {
        public static String helloWorld() {
            return "Hello, World!";
        }
    }
com.example.app 中的代码
  • com/example/app/App.java:
    package com.example.app;
    
    import com.example.mylibrary.api.MyLibrary;
    
    public class App {
        public static void main(String[] args) {
            System.out.println(MyLibrary.helloWorld());
        }
    }

编译和运行

  • 编译:

    javac --module-source-path src --class-path . -m com.example.mylibrary:src/com/example/mylibrary
    javac --module-source-path src --class-path . -m com.example.app:src/com/example/app
  • 运行:

    java --module-path . -m com.example.app/com.example.app.App

结论

JPMS通过引入模块的概念,为Java应用程序提供了一种更强大的方式来管理依赖关系和控制包的可见性。这不仅提高了代码的可维护性和安全性,还使得构建大型应用程序变得更加容易。随着Java平台的不断发展,模块化将成为Java开发的标准做法。

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

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

相关文章

Kafka入门:从零开始了解分布式流处理平台

什么是Kafka Apache Kafka是由LinkedIn公司开发,后来由Apache软件基金会维护的一个分布式、分区、多副本的基于ZooKeeper协调的分布式消息系统。Kafka不仅是一个消息队列,还是一个强大的流处理平台,它能够实时地处理大量数据,满足…

Springboot如何实现redis消息的订阅发布

1. 环境准备 确保你已经安装了 Redis 服务器,并且可以在本地或者远程访问它。如果你还没有安装 Redis,请先安装并启动 Redis 服务。 2. 创建 Spring Boot 项目 使用 Spring Initializr 或者其他 IDE 创建一个新的 Spring Boot 项目,并添加以下…

Leetcode 1047-删除字符串中的所有相邻重复项

给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。 在 S 上反复执行重复项删除操作,直到无法继续删除。 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。 题解 题目链接 //先进后出&a…

cubeide Target is not responding, retrying... 或基于vscode方式等 无法调试

点击调试输出如图: 基于cubeidet开发环境,debug后输出: 基于vscode开发环境: OpenOCD: GDB Server Quit Unexpectedly. See gdb-server output in TERMINAL tab for more details. 解决方法: 这里的调试选择一个&…

Vue3源码调试-第二篇

前言 上篇我们见到一个很厉害的方法,这篇我们来看看 baseCreateRenderer 首先,方法太多了,我也不一个一个数有多少个了,因为我们着重使用createApp方法,那么我们就跟着代码走,用到哪个方法就分析哪个方法…

vue的for循环不建议用index作为key

我们页面总有一些相似的,我们想用循环渲染,根据对象数组结构进行渲染,这是不是很熟悉的场景。这时候我们需要有一个唯一的key绑定在循环渲染的元素上,一般情况下我们会用id,因为id是唯一的。然而有些页面要循环的数据&…

python 把一个视频复制3次

1. 先看效果 输入 输出 2. 代码 第一种方法 moviepy 代码来源 gpt4o from moviepy.editor import VideoFileClip, clips_array# 加载视频 video VideoFileClip("a22.mp4")# 复制视频三次 video_copied clips_array([[video, video, video]])# 输出最终的视频 vi…

关于tresos Studio(EB)的MCAL配置之ADC

General Adc_DeInit API 使能Adc_DeInit接口 Adc Development Error Detection 开发者错误检测 Adc Enable Limit Check边界检测 Adc Queue启用队列,如果AdcPriorityImplementationADC_PRIORITY_HW_SW执行优先级为硬件则一定要开启队列 Adc_StartStopGroup API使…

XSS LABS - Level 14 过关思路

关注这个靶场的其他相关笔记:XSS - LABS —— 靶场笔记合集-CSDN博客 0x01:关卡配置 这一关有些特殊,需要链接到外部站点,但是这个站点已经挂了,无法访问: 所以笔者就根据网上的资料,对这一关进…

ARM体系结构和接口技术(十一)定时器中断实验

文章目录 一、实验分析二、RCC章节:找到外设基地址并使能外设控制器时钟源1. RCC2. GICC和GICD3. TIM3 三、TIM3章节(一)CR1寄存器(二)DIER寄存器(三)SR寄存器(四)PSC寄存…

JS中this的指向问题、JS的执行机制、offset、client、scroll

JS中this的指向问题 1. 在全局环境下 在全局环境中(在浏览器中是 window 对象,在Node.js中是 global 对象),this 指向全局对象。 console.log(this window); // 在浏览器中为 true console.log(this.document ! undefined); //…

基于ssm+vue+uniapp的农业电商服务系统小程序

开发语言:Java框架:ssmuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:M…

代码随想录算法训练营第四十一天 | 121. 买卖股票的最佳时机 , 122.买卖股票的最佳时机II , 123.买卖股票的最佳时机III

目录 121. 买卖股票的最佳时机 思路 暴力 贪心 动态规划 1.确定dp数组(dp table)以及下标的含义 2.确定递推公式 3.dp数组如何初始化 4.确定遍历顺序 5.举例推导dp数组 方法一: 贪心 方法二:动态规划1 方法三&#xf…

使用rqt_console和roslaunch

1.使用rqt_console和rqt_logger_level rosrun rqt_console rqt_console 执行完该命令后有如下界面: 继续执行如下命令: rosrun rqt_logger_level rqt_logger_level 此时有如下新界面: 接下来继续运行如下命令: rosrun turtlesim turtlesim_node 上面第一…

慢sql问题解决,sql优化,数据库(mysql)

文章目录 1、count效率比较2、作者遇到的慢sql问题2.1、使用排序导致变慢问题2.2、使用LEFT JOIN 导致索引失效的问题2.3、子查询导致索引失效 3、explain命令介绍4、阿里云rds数据库(mysql的一种)主键索引查询很慢问题参考文档 1、count效率比较 所以结…

初识C++(8.27)

用C实现: 提示并输入一个字符串&#xff0c;统计该字符串中字母个数、数字个数、空格个数、其他字符的个数. #include <iostream> #include <string>using namespace std;int main() {string str;cout << "请输入一个字符串: ";getline(cin, str…

uni-app - - - - - 使用uview-plus详细步骤

uni-app - - - - - 使用uview-plus详细步骤 1. 使用HbuilderX创建空白项目2. 安装插件3. uview-plus配置使用3.1 main.js配置3.2 uni.scss配置3.3 App.vue配置3.4 pages.json 4. 重启Hbuilderx 1. 使用HbuilderX创建空白项目 2. 安装插件 工具 > 插件安装 > 前往插件市场…

用Python探究两组变量的相关性_典型相关分析(CCA)模板

典型相关分析&#xff08;Canonical Correlation Analysis, CCA&#xff09;是一种多变量统计分析方法&#xff0c;用于研究两组变量之间的整体相关性。它的基本原理是在两组变量中分别提取有代表性的两个综合变量&#xff08;即两组变量的线性组合&#xff09;&#xff0c;通过…

Java设计模式之工厂模式详细讲解和案例示范

在Java的设计模式中&#xff0c;工厂模式&#xff08;Factory Pattern&#xff09;是最常见和最有用的一种创建型模式。工厂模式的核心思想是将对象的创建与使用分离&#xff0c;从而提供了一种灵活的方式来创建不同类型的对象。这种模式尤其适用于复杂对象的创建过程&#xff…

HTTrack镜像网站实践

目录 前言 Windows下使用HTTrack HTTrack安装 HTTrack使用 Kali linux下使用HTTrack HTTrack安装 HTTrack使用 前言 在特殊时期&#xff0c;不想把真实的网站页面展示给用户&#xff0c;但又不能关停。此刻&#xff0c;可以用镜像网站替换真实网站&#xff0c;降低安全风…