WAR文件的Java 9模块化也是吗?


问题内容

Java EE 7应用程序服务器,特别是Servlet
3.1容器,应允许我们部署包含Web应用程序的WAR文件。WAR文件本质上是一个具有部署描述符(web.xml)和其他几个元素的JAR 。

另一方面,Java 9引入了 模块化JAR文件 的概念,即具有模块描述符(module- info.class)的JAR,该模块根据项目Jigsaw构成模块。

那么,WAR文件是否也可以包含模块描述符并生成“模块化WAR文件”?

是否已经有应用程序服务器能够接受“模块化WAR文件”的部署?

一般来说,就Java 9模块化而言,servlet容器和WAR文件的未来是什么?


问题答案:

当前,Java EE和Java 9(jigsaw)模块之间没有链接。未来的Java EE版本可能会引入规范定义的行为,说明如何与拼图模块交互。

此时,所有应用服务器在JDK9上运行时均以“类路径模式”运行,这实际上意味着它们不使用拼图。

在大多数情况下,将模块信息引入战争部署只会导致部署问题,因为JDK可能会尝试以不同于应用服务器其他部分的方式加载它。或者甚至没有什么不同,因为大多数应用服务器都具有用于加载jar和类的自定义逻辑。

如今,一些应用服务器已经实现了某种模块化,例如OSGi(GlassFish,Liberty)或jboss-
modules(Wildfly),但是目前,竖锯仍存在一些局限性,无法在其上运行此类模块化系统。

简而言之,直到更新了EE规范(大约9+)以描述EE部署应如何在启用了拼图的运行时上运行之前,还没有“正式”的方式来说明这种部署的行为方式。在此之前,每个应用程序服务器都可以为其实现一些自定义支持,但这并不是标准的。