对我来说,Java的包管理系统一直都很简单和有效。JDK本身就大量使用它,我们一直在使用它来模拟命名空间和模块的概念。
Project Jigsaw(又称Java平台模块系统)试图填补什么空缺呢?
官方网站上是这样描述的:
该项目的目标是为Java SE平台设计和实现一个标准的模块系统,并将该系统应用于平台本身和JDK。
对我来说,Java的包管理系统一直都很简单和有效。JDK本身就大量使用它,我们一直在使用它来模拟命名空间和模块的概念。
Project Jigsaw(又称Java平台模块系统)试图填补什么空缺呢?
官方网站上是这样描述的:
该项目的目标是为Java SE平台设计和实现一个标准的模块系统,并将该系统应用于平台本身和JDK。
Jigsaw和OSGi试图解决同样的问题:如何允许更粗粒度的模块进行交互,同时保护它们的内部。
在Jigsaw的情况下,更粗粒度的模块包括Java类、包及其依赖项。
这里有一个例子:Spring和Hibernate。两者都依赖于第三方JAR CGLIB,但它们使用不兼容的版本。如果您依赖于标准JDK,该怎么办?包含Spring想要的版本会破坏Hibernate,反之亦然。
但是,如果您有像Jigsaw这样的更高级别模型,就可以轻松管理不同模块中不同版本的JAR。将它们视为更高级别的包。
如果您从GitHub源代码构建Spring,也会看到这一点。他们重新设计了框架,使其由多个模块组成:核心、持久化等。您可以选择应用程序需要的最小模块依赖项并忽略其余部分。以前是一个单独的Spring JAR,其中包含所有.class文件。
更新:五年后 - Jigsaw可能仍需要解决一些问题。
AFAIK计划是使JRE更具模块化,即拥有可选的较小的jar包或者您只需下载/升级所需的功能。
这旨在减少膨胀并为您提供放弃传统模块的选项,这些模块可能大多数人都不使用。
import
时,它所做的只是将该类引入编译器的命名空间中。如果你实际上没有使用它,它不会出现在生成的字节码中。 如果你实际上使用了该类,则需要在运行时拥有该类和它使用的每个类。理论上,你可以创建一个裁剪版的Guava API版本,其中仅包含你需要的内容,并使用该JAR文件代替。但实际上这种做法容易出错,在大多数情况下没有什么用处,最终你还是得添加整个JAR文件才能发布。 - Peter Lawrey根据Mark Reinhold在Devoxx比利时的主题演讲,Project Jigsaw将解决两个主要问题:
我们都知道JAR Hell。这个术语描述了类加载过程可能无法正常工作的各种方式。Classpath最为人所知的限制包括:
JDK的巨大而臃肿的特性导致了几个问题:
Jigsaw是一个持续了很多年的庞大项目。它有大量的JEPs,这些是获取关于该项目更多信息的好地方。以下是其中一些JEPs:
在模块系统的现状报告的最初版本中,马克·莱恩霍尔德描述了模块系统的具体目标如下:
这些功能将直接受益于应用程序开发人员、库开发人员和Java SE平台本身的实现者,也将间接地使平台具有可扩展性、更高的完整性和更好的性能。
com.acme.foo.db.api.UserDao
com.acme.foo.db.impl.UserDaoImpl
// com.acme.foo.db.api.UserDao is accessible, but
// com.acme.foo.db.impl.UserDaoImpl is not
module com.acme.foo.db {
exports com.acme.foo.db.api;
}
问题2:反射是不受限制的
假设在Java 8中有以下类:
Class c = Class.forName("com.acme.foo.db.impl.UserDaoImpl");
Object obj = c.getConstructor().newInstance();
foo-app.jar
可能使用 foo-services.jar
,后者又使用了 foo-db.jar
。我们可能会断言,在 foo-app.jar
中的类不应该绕过“服务层”并直接使用 foo-db.jar
。然而,没有办法通过类路径来执行这个断言。Mark Reinhold提到了this here。rt.jar
中。在我的机器上,它有60多MB和20k个类!在微服务、IoT设备等时代,如果不使用Corba、Swing、XML和其他库,则将其保存在磁盘上是不可取的。jlink
工具。假设应用程序完全模块化,jlink
会生成一个可分发的运行时映像,其中只包含指定的模块(及其依赖项)。展望未来,Oracle设想JDK模块被预先编译为本机代码。尽管jlink
是可选的,AOT编译是试验性的,但它们都是Oracle前进方向的重要指示。bar-lib-1.1.jar
和bar-lib-2.2.jar
。
NoSuchMethodError
和NoClassDefFoundError
。 - Tamas Hegedus