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

JPMS/Project Jigsaw对小型应用程序/库的好处

单凯捷
2023-03-14

我理解Java平台模块系统(JPMS)对大型应用程序的好处,但是有没有理由将一个小型库或应用程序变成一个(单个)模块?如果是这样,模块化Jar文件是实现这一目标的最佳方法,还是首选常规方法?

展望未来,模块化v. classpath程序是否会对性能产生影响?

共有3个答案

匡晟
2023-03-14

发现此链接信息丰富
http://www.javaworld.com/article/2878952/java-platform/modularity-in-java-9.html

JAR文件模块化程度不够吗?

JAR文件及其操作的部署环境大大改进了许多现有的遗留部署约定。但是JAR文件没有内在的唯一性,除了一个很少使用的版本号,它隐藏在中。jar清单。JAR文件和可选清单不作为Java运行时环境中的模块化约定使用。因此,文件中类的包名及其在类路径中的参与是JAR结构中唯一为运行时环境提供模块化的部分。

简而言之,JAR是模块化的良好尝试,但它们并不能满足真正模块化环境的所有要求。Spring和OSGi等框架和平台使用JAR规范的模式和增强功能,为构建功能强大的模块化系统提供环境。然而,随着时间的推移,即使是这些工具也会屈服于JAR规范JAR hell的一个非常不幸的副作用!

类路径/JAR地狱

当Java运行时环境允许任意复杂的JAR加载机制时,开发人员知道他们处于类路径地狱或JAR地狱中。许多配置可能导致这种情况。

首先,考虑这样一种情况:Java应用程序开发人员提供了应用程序的更新版本,并将其打包到一个与旧版本名称完全相同的JAR文件中。Java运行时环境没有提供用于确定正确JAR文件的验证工具。运行时环境只需从它首先找到的JAR文件或满足许多类路径规则之一的JAR文件中加载类。这最多会导致意外行为。

JAR地狱的另一个例子是,两个或多个应用程序或进程依赖于第三方库的不同版本。使用标准类加载工具,在运行时只有一个版本的第三方库可用,从而导致至少一个应用程序或进程中的错误。

功能齐全且高效的Java模块系统应该有助于将代码分离为不同的、易于理解的和松散耦合的模块。依赖性应该明确规定并严格执行。应该提供允许模块升级而不会对其他模块产生负面影响的设施。模块化运行时环境应该支持特定于特定领域或垂直市场的配置,从而减少环境的启动时间和系统占用。

Java的模块化解决方案

除了到目前为止提到的模块化特性之外,最近的工作还增加了一些。以下功能旨在优化性能并扩展运行时环境:

分段源代码:将源代码分为不同的缓存段,每个缓存段都包含特定类型的编译代码。其目标包括在垃圾清理、增量构建和更好的内存管理期间跳过非方法代码。

构建时强制:用于强制名称空间、版本控制、依赖项和其他内容的语言构造。

部署设施:支持根据特定需要部署扩展的运行时环境,例如移动设备环境

东方明亮
2023-03-14

如果是这样,模块化Jar文件是实现这一点的最佳方法,还是首选正常方法?

我不知道你所说的“正常方法”是什么意思-模块化JAR是创建构件的“正常方法”,模块系统将为其创建模块。

[一] 是否有任何理由将一个小型库或应用程序制作成一个(单个)模块?

是的,有几个:

>

  • 创建模块化应用程序或使用模块化库的开发人员受益于可靠的配置,只有在存在所有依赖项的情况下,他们才能启动应用程序-无论应用程序/库有多大,这都是一个好处。

    作为库设计器,您可以隐藏内部构件。虽然强封装只有在模块化JAR被放在模块路径上时才有效,但模块描述符仍然在代码中记录您的意图,并允许您更肆无忌惮地更改代码。应用程序开发人员也从中受益,因为他们不再意外地依赖不受支持的实现细节。

    即使在小型应用程序和库中,服务也可用于解耦功能的不同方面并使代码更容易扩展。

    只有“真实”模块(与自动模块相反)才能通过jlink包含在运行时映像中。不提供模块化JAR会剥夺用户使用库的这种可能性。

    另请注意,您永远不知道哪个小应用程序或库可能会变成更大的东西。:)

    展望未来,模块化v. classpath程序是否会对性能产生影响?

    在构建模块图和验证模块花费时间的同时,模块系统应该用改进的类加载策略来弥补:它记录每个模块导出的包,并直接从该模块加载该包中的类型,而不必扫描整个类路径。不管怎样,我不认为这是一个决定性因素。

  • 白腾
    2023-03-14

    直接的绩效影响包括:

    • 模块化的应用程序可以选择使用jlink,以便减少可分发运行时的大小:它只使用您需要的模块。所以,如果您不需要Swing、Corba等,它就不驻留在磁盘上。(此处有更多信息)

    这并不能保证你的应用程序会更快,但不可否认,上面的内容很有吸引力。

    从长远来看,请考虑:

    • 虽然在JDK 9中是实验性的,但有一个AOT编译器(Linuxx64)将java.base模块编译为本机代码。这可能是未来Java版本的前进道路。这肯定会改善未来的启动时间。(再次,更多信息请点击此处)
     类似资料:
    • 我想在应用程序运行时找到我的对象大小。我想用千分尺在Grafana中显示我的对象大小。 我的对象像人、学生、...... 我该怎么办? 对象大小像文件大小、对象体积

    • 问题内容: 我正在编写一个servlet(特别是Scalatra)。在servlet中,我在目录中包含许多链接,该目录包含在每个页面中。我希望这些链接相对于应用程序基础。如果我使用诸如“ / foo”之类的链接,那么当从根目录(localhost:8080 /)提供servlet时一切正常,但是如果我从Jetty / Tomcat以及其他servlet(localhost:8080 / servl

    • 问题内容: 我们正在使用不同的体系结构层(例如域,接口,基础结构和应用程序)构建一个小型应用程序。这遵循洋葱DDD模型。现在,我想知道将应用程序拆分为多模块Maven项目是否有任何好处。据我所知,这似乎使事情变得比所需要的更加困难。整个应用程序将作为单个WAR文件部署到Tomcat容器中。 问题答案: 拆分应用程序对以下情况有意义: 当项目的某个部分需要新功能或错误修复时,您可以仅关注该模块并为其

    • 问题内容: 我想编写一个执行屏幕操作的Java终端应用程序。有没有好的图书馆可以让您像* nix / C世界中的诅咒一样操纵屏幕? 我正在寻找的最小功能是窗口和用户输入支持。 在功能方面,我想在终端的区域中定期更新一些数据,同时(同时)用户可以在屏幕的其他部分输入命令/文本。 问题答案: 有Charva,它链接到本机代码,但是具有基于Swing的api

    • 想改进这个问题吗 通过编辑这篇文章,更新问题,以便用事实和引文来回答。 我有一个网站,由大约20个Java Web应用程序(基于Servlet/JSP的Web应用程序)组成,大小不一,每个应用程序处理网站的不同区域。 所有20个war的总大小为350mb,然而,通过将它们结合起来,我预计最终能够减少这一大小,并实现组合缓存的好处。 最好将它们分开,还是将它们合并到一个Uber webapp war

    • 我现在将在Google play Store上发布我的第一个应用程序。我已经压缩了应用程序中使用的图像。我有一些关于应用程序大小的问题。 如果应用程序的大小小于2 MB那么用户卸载应用程序的机会就会减少,我的这句话对于属于教育领域的应用程序是真的吗? 然而,当我在windows中看到我的apk文件时,它显示为3.10MB,但当它安装到设备中时,从应用程序信息中查看时,它显示: 并且,我在我的项目中