首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【Java 基础篇】Java 模块化详解

可重用性差:在多个应用程序之间共享代码资源比较困难。 安全性问题:所有的类都在同一个类路径中,这可能导致意外的访问依赖关系。 Java模块化解决了这些问题。...模块(Module) 一个模块是一个可重用的单元,它包含了一组相关的类资源。每个模块都有一个名字,并可以声明自己的依赖关系。 2....模块声明(Module Declaration) 一个模块声明是一个包含module-info.java文件中的文件,它定义了一个模块的名称、依赖关系其他特性。 3....以下是一些模块化的更多操作: 导出打包模块:您可以使用exports关键字在module-info.java中声明哪些可以被其他模块访问。这允许您控制哪些部分的代码对外可见。...开放模块:如果您希望模块对所有其他模块开放,可以使用open关键字。这对于编写插件或扩展模块很有用。

56620

Java 模块化编程JPMS-Java 9系列文章第8篇

与Java 中的package有些类似,module引入了Java代码分组的另一个级别。每个这样的分组(module)都包含许多子package。...通过在一个模块的源代码文件package的根部,添加文件module-info.java来声明该文件夹及其文件夹为一个模块。...二、模块导出package 文件module-info.java可以指定该模块下面的哪些package对外可见、可访问。通过一个新的关键字exports来实现该功能。...三、模块导入package 如果另一个模块想要使用被导出的package中的类,可以用requires关键字在其module-info.java文件中来导入(读取)目标模块的package。...这也就意味着一个问题,有些public class我们本来是打算在jar定义的范围内使用的,但是结果却是任何引入了这个jar的项目都可以使用这个jar里面所有的public class代码。

57021
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java9来了,快来了解下JPMS基础吧!

    开发人员可以一个(pacakge)不被其他模块看到就是一个可以隐藏在一个模块中。 在理论上,能够隐藏软件对于应用程序设计来说应该是一个很大的好处。...包含程序A的模块包含程序B的模块存在依赖关系。...所有使用module-info文件仅适用于在模块路径上使用模块化jar。为了兼容性,类路径中的所有代码都打包成一个特殊的未命名模块,没有隐藏的对整个JDK的完全访问。...我已经相信,在包含最高之后,来命名你的模块,然后该模块“拥有”,是唯一的理想策略。 构建系统的冲突 - 谁负责? Maven pom.xml还包含有关项目的信息。是否应该扩展以允许添加模块信息?...以上只是对module-info.java文件可能的内容JPMS的限制的总结。如果你正在考虑模块化您的lib或应用程序,请等一会儿,直到所有内容变得更清晰再说吧!

    2.8K80

    java9 opens与exports的区别

    序 本文主要研究下java9 opens与exports的区别 open及exports open open module 主要用于解决deep reflection问题,open的作用是表示该模块下的所有的包在...opens package 用于声明该模块的指定包在runtime允许使用反射访问 exports 表示允许在编译时运行时访问指定的public成员 open及exports对反射的影响 反射方法...直接open整个module,但是没有exports module-info.java open module packt.lib { exports com.packt.lib; } 直接访问类反射...这种情况,如果是直接访问该类来使用反射,由于没有exports该package,则直接编译报错 通过名反射 这种情况编译可以通过,运行正常 直接open整个module,也有exports open...小结 open表示允许运行时通过反射使用open的作用是表示该模块下的所有的包在runtime都允许deep reflection(包括public及private类型);opens package的作用只是允许该包在

    44120

    Java一分钟之——Java模块系统:模块化开发(Jigsaw)

    Java 9引入了一个名为Jigsaw的新特性,即Java模块系统,它旨在提高Java应用程序的可维护性、可扩展性安全性。...模块系统简介 Java模块系统通过定义模块(Module)来组织代码,每个模块包含一组相关的,并声明对外部的依赖。...模块通过module-info.java文件来定义,其中包含了模块的名称、导出的以及依赖的其他模块。...明确声明依赖:在module-info.java中清晰列出所有直接间接依赖的模块。 谨慎导出包:只导出对外部需要的,保护内部实现细节。...通过合理规划模块结构,明确声明依赖关系,以及谨慎控制的导出,我们可以构建出更加整洁、安全可维护的Java应用。

    35710

    Java 9的模块系统到底怎么用

    模块描述符文件module-info.java 必须有。 名称必须是唯一的。即使在不同的模块中,我们也不能有相同的名。 每个模块将创建一个 jar 文件。...该模块有以下特性: 默认导出所有。 默认情况下可以访问所有其他模块的类。 未命名模块 添加到类路径中的 jar 类。...当我们将 jar 或类添加到类路径时,所有这些类都会添加到未命名的模块中 只导出到其他未命名的模块自动模块。这意味着,应用程序模块无法访问这些类。 它可以访问所有模块的类。...导出包 默认情况下,模块里下所有都是私有的,即使被外部依赖也无法访问,一个模块之内的还遵循之前的规则不受模块影响。...open com.xxx{ } 在这种情况下,com.xxx 模块的所有可以使用反射访问。

    1.3K10

    Java9-Java17新特性

    这里我们创建一个新的项目,并在src目录下,新建module-info.java文件表示此项目采用模块管理机制: //模块名称随便起一个可以,但是注意必须是唯一的,以及模块内的名也得是唯一的,即使模块不同...每个模块可以有任意数量的类型 一个模块可以依赖于任意数量的模块 模块描述符 在 Java 9 模块中,模块描述符是包含描述模块的模块元数据的资源。...模块描述符可以同时具有exportsrequires子句;这意味着它将导出到其他模块并使用其他模块的——因为它依赖于其他模块,所以它不是一个独立的模块。...模块路径只能包含每个模块中的一个,并且每个只能在一个模块中定义。如果两个或多个模块具有相同的名称或导出相同的,则运行时会在运行程序之前立即终止。...比如现在我们创建了一个新的Maven项目: 项目演练 然后我们导入了junit框架的依赖,如果我们不创建module-info.java文件,那么就是一个未命名模块,未命名模块默认可以使用其他所有模块提供的类

    50020

    java9系列(三)模块系统精要

    unnamed modules会声明依赖所有的named module,且exports自己的所有,但是一个named module不能声明依赖unnamed module。...如果一个package在namedunnamed模块中都有定义,则使用named中的package。...(需要在javac编译时使用--module-path指定这些jar的路径) 一个automatic modules会声明依赖所有namedunnamed module,然后导出所有package,另外对其他...module open module编译时仅限于指定的导出模块可用,但是在runtime时允许所有反射使用(包括private类型成员)。...open语法主要用于向后兼容,很多遗留代码都使用反射 5.service loader 主要在module-info.java描述本模块是要使用哪个service接口或者提供了哪个service的实现。

    70020

    【Java】A Guide to Java 9 Modularity

    ,因为在默认情况下,所有软件都是模块私有的。...如果从一个不具备模块化的Java项目迁移到具备模块化的Java项目,为了保持向前兼容,会将所有归属于未命名模块。2.5....包含比如一个模块的一个或多个目录的列表。 add-reads - 我们可以使用相当于 requires 指令的命令行;-add-reads,而不是依赖模块声明文件。...虽然我们可以使用 open 、opens opens...to 选项来处理反射只在运行时授权访问。但是需要注意这些指令都是 只在运行时间内生效!...JDK中包含的模块。介绍模块声明文件,如何在实际项目使用。创建了一个建立在模块系统之上的简单应用程序最后可以从 案例代码 中找到本文的所有实践部分。

    18820

    什么?Java9这些史诗级更新你都不知道?Java9特性一文打尽!

    模块就是代码、数据一些资源的自描述集合。它是一组与代码、数据资源相关的。 每个模块仅包含一组相关的代码和数据,以支持单一职责原则(SRP)。 ?...image 这里的 JDK 9 不包含 JRE。在 JDK 9 中,JRE 分为一个单独的分发文件夹。JDK 9 软件包含一个新文件夹 “ jmods”,它包含一组 Java 9 模块。...模块系统小结 我们从上面的例子中可以看到,我们可以指定我们想要导出引用的软件,没有人可以不小心地使用那些不想被导出的软件中的类。...启动模块化应用程序时,JVM 会根据 requires 语句验证是否可以解析所有模块,这比脆弱的类路径要安全得多。模块使您能够通过强力执行封装显式依赖来更好地构建应用程序。 四....Java SE 9 将对该语句进行一些改进,以避免更多的冗长提高可读性。

    1.6K20

    Java 模块化设计:概念与实战应用

    Java 模块系统(Jigsaw 项目)模块:一个模块是一个包含的代码和数据集合,它声明它需要的依赖关系以及它愿意公开的API。...模块描述符:每个模块都包含一个 module-info.java 文件,该文件定义了模块的名称、它所需的其他模块以及它导出的。2....封装依赖性管理强封装:模块可以隐藏其内部实现,仅通过定义好的API与其他模块交互。显式依赖:模块必须显式声明它们依赖的其他模块,这提高了系统的可维护性透明度。...实战应用:构建一个模块化的Java应用示例模块化架构模块 com.example.logging:提供日志服务。模块 com.example.data:处理数据存取。...; }}结论模块化设计使 Java 开发者能够构建更加结构化维护的应用程序。通过定义清晰的模块界限依赖关系,可以提高代码的可读性可管理性,同时降低长期维护的复杂性。

    37221

    深入理解JVM(③)Java的模块化

    public类型不再意味着所有地方代码都可以访问它们,未导出未开放的类是不能够被外部使用。 举例说明: 新创建一个maven工程,并创建两个module。 ?...只要放在类路径上的JAR文件,都会被当作传统的JAR来对待;相应地,只要放在模块路径上的JAR文件,即使没有使用JMOD后缀,甚至不包含module-info.class文件,也仍然会被当作一个模块来对待...JAR文件在类路径的访问规则:所有类路径下的JAR文件及其他资源文件,都被视为自动打包在一个匿名模块(Unnamed Module)里,这个匿名模块几乎是没有任何隔离的,它可以看到使用类路径上所有...模块在模块路径的访问规则:模块路径下的具名模块(Named Module)只能访问到她依赖定义中列明依赖的模块,匿名模块里所有的内容对具名模块来说都是不可见的,即具名模块看不见传统JAR的内容。...JAR文件在模块路径的访问规则:如果把一个传统的、不包含模块定义的JAR文件放置到模块路径中,它就会变成一个自动模块(Automatic Module)。

    1.1K30

    【Java】A Guide to Java 9 Modularity

    一个模块是一组密切相关的资源,以及一个新的模块描述符文件。 怎么理解这个概念呢?实际上抽象理解为在 package 的基础上再套了一层即可。...这个文件被称为模块描述符,包含了构建和使用我们的新模块所需的所有数据。...包含比如一个模块的一个或多个目录的列表。 add-reads - 我们可以使用相当于 requires 指令的命令行;_-add-reads_,而不是依赖模块声明文件。...我们可以把实现放在一个私有中,而把接口暴露在一个公共中。...JDK中包含的模块。 介绍模块声明文件,如何在实际项目使用。 创建了一个建立在模块系统之上的简单应用程序 最后可以从 案例代码 中找到本文的所有实践部分。

    20020

    JDK19都出来了~是时候梳理清楚JDK的各个版本的特性了【JDK9特性讲解】

    去下载各种不同版本的JDK, 因为JDK是向下兼容的,所以我们使用一个较新的JDK,就可以去测试学习从9-最新所有版本的新特征了,我们这里以安装openjdk19为例,下载安装JDK19的压缩...: bin 包含所有指令,在windows平台上,他继续包含系统的运行时动态链接 conf目录 包含用户可编辑的配置文件,例如之前位于jre/lib目录中的.propertiespolicy includes...模块之间的可访问性是所使用的模块使用模块之间的双向协议:模块明确地使其公共类型可供其他模块使用,而且使用这些公共类型的模块明确声明对第一个模块的依赖,模块中所有未导出的软件都是模块的私有的,他们不能在模块之外使用...设置哪些可以向外暴露 然后在JDK19Module2的module-info.java中引入模块2 但是发现报错了,原因是,我们要把模块1添加为模块2的运行环境,具体操作如下 project structure...简单的输出语句 变量定义: 方法定义调用 导处理   其实jshell中有默认的导入一些(除了java.lang之外,以下可以直接用),可以直接使用不用导,查看有哪些: 常用命令

    1.7K40

    java9 module相关选项解析

    序 本文主要解析一下java9 module相关选项 module分类 unnamed module 在classpath的所有jar(不管是否模块化)共同组成一个unnamed module unnamed...modules会声明依赖所有的named module,且exports自己的所有,但是一个named module不能声明依赖unnamed module。...如果一个package在namedunnamed模块中都有定义,则使用named中的package。...,取其值作为模块名,没有的话,将jar文件名根据一定规则提取模块名,如果提取不成功则无法转变为automatic module) automatic module 默认导出/open自己所有的package...requires java.xml.ws.annotation transitive layers layer之于module,就相当于classloader之于class,layer是module的一个加载实例化的机制

    1.4K10
    领券