当前位置: 首页 > 知识库问答 >
问题:

Java 9模块:自动模块能否产生更大(完整)的项目?

谢嘉
2023-03-14

我猜自动模块:

http://openjdk.java.net/projects/jigsaw/spec/sotms/#automatic-模块

意味着需要第三方jar的项目的每个模块都必须将该jar打包到自己的模块化jar中。如果是这样的话,那么一个大型多模块应用程序最终是否会比其基于类路径的Java 8应用程序更大呢?我想到了所有几乎无处不在的apache库和其他常见的开源依赖项。

我在未来获得胜利;所有这些第三方库本身都是模块化的,因此只需要分发最小的配置。但是,在短期内,如果没有类路径,难道不会有一些非常庞大的模块化jar吗?还是我遗漏了什么?

共有2个答案

司空和悌
2023-03-14

您的问题和评论意味着类路径正在消失:事实并非如此。

在讨论自动模块之前,还有其他概念需要理解。

在Java9中,类路径仍然存在,熟悉的遗留jar(即非模块化jar)仍然可以工作。但是,还有一个包含模块化jar的新模块路径。

模块化JAR包含模块信息。类,它非常明确地说明了(a)作为依赖项所需的模块和(b)导出的包。

一个关键点是类路径和模块路径之间的交互:

  • 类路径上的遗留jar对modulepath一无所知,因此它们被授予访问所有模块的权限
  • 因为类路径通常是混沌的,所以它被称为未命名模块。由于没有名称,modulepath上的模块化JAR无法在其模块信息中引用遗留JAR。java

有了这么多的信息,就不可能以零碎的方式对项目进行模块化:如果应用程序jar需要第三方库,我们将不得不(a)等待库作者对其进行模块化,或者(b)尝试自己对其进行模块化。两者都不是新手。

输入自动模块。它们是驻留在模块路径上的遗留(非模块化)jar。它们充当类路径和模块路径之间的桥梁,因为:

  • 自动模块被命名(机制可能是一个单独的问题),并且可以被模块引用
  • 自动模块被授予对未命名模块(即类路径上的遗留JAR)和modulepath上的所有模块(即JDK模块)的读取权限

本视频和本视频提供了插图。

冯宏恺
2023-03-14

我想你误解了自动模块的工作原理。它们的关键特性是,您可以使用现有的非模块化JAR,将它们放在模块路径上,并将它们显示为模块以供编译或在运行时使用。

我猜自动模块意味着需要第三方jar的项目的每个模块都必须将该jar打包到自己的模块化jar中。

不,一点也不。相反,您可以重用现有的jar。

 类似资料:
  • 我的项目依赖于Netty Epoll Transport。以下是依赖关系: 无法派生模块描述符:netty-transport-native-epoll-4.1.17。final-snapshot-linux-x 86_64.jar netty.transport.native.epoll:无效的模块名:'native'不是Java标识符 有什么变通办法吗?(当然,除了“释放正确的netty神器”

  • 主要内容:模块系统特征,创建模块Java 9是一种称为模块的新型编程组件。模块是一个自我描述的代码和数据集合,并有一个名称来标识它。 模块系统特征 使用模块组件,Java 9中增加了以下增强功能 - 引入了一个新的可选阶段,即链接时间。这个阶段介于编译时间和运行时间之间。 在此阶段,可以组合和优化一组模块,使用jlink工具制作自定义运行时映像。 javac,jlink和java有额外的选项来指定模块路径,它们进一步定位模块的定

  • 食氧;视窗7;JDK 9决赛从9日开始,21日结束;JUnit4.12和现有的应用程序。作为起点,可以编译、执行应用程序,并且所有JUnit测试都显示为绿色。现在我们使用eclipse生成文件模块信息。JAVA结果是: 但有一个错误:junit无法解析为模块。问题是:如何告诉文件junit没有定义任何模块,应该在兼容模式下运行?

  • 我有一个多模块maven项目,包含三个模块、和 Core具有以下依赖项定义 我已经为所有三个模块添加了Java9定义,的如下所示: 但是,我不知道如何让的测试类能够在测试执行期间看到类。当尝试测试运行时,找不到类。 如果向的添加需要My.Project.TestUtils;的: 然后在编译时,我得到一个错误,即找不到模块(大概是因为它只是作为测试依赖项引入的)。 在Java9模块化的世界中,如何处

  • 我正在使用Intellij IDEA中的一个Java项目,其中我们有许多内部、独立的Maven依赖项。我将这些依赖项的源代码作为模块导入到我的IDEA项目中,但是当我选择转到- 为了解决这个问题,我需要做以下工作: 使用内部 Maven 依赖项在模块上打开模块设置 在“依赖关系”列表中查找并删除内部 Maven 模块 添加新的模块依赖项,然后选择与内部 Maven 依赖项对应的导入模块 有没有办法

  • 我使用Jenkins CI(单管道作业)将不同的文件推送到JFrog Artifactory。 对于每个构建,我都会将构建信息发布到 Artifactory。但每个构建都有相同的模块 ID。 例如:在工件存储库浏览器中选择任何工件,然后转到构建选项卡,然后它显示所有构建而不是相应的工件构建信息 所以我想知道如何在将工件信息发布到工件工厂的同时修改工件模块 ID