WEB-INF/lib目录与Java 9模块

21

Web应用程序的WEB-INF/lib目录是放置jar文件的地方,而servlet容器(例如Tomcat)会自动将其纳入应用程序的类路径中。那么对于Java 9中的模块化jar文件,这个机制是如何工作的(或者将来应该如何工作)?这些模块提供了模块,用户必须指定应用程序使用哪些包含/导出的模块/包。除了(旧的)类路径之外,还有一个模块路径。

一个模块化的jar是否可以在没有任何进一步的规格说明/配置的情况下工作,以便所有导出或包含的模块都会出现在类路径中呢?

Java EE 8和Tomcat 9已经发布。这两个项目声称支持Java 9。因此,应该有一种方式可以按照模块的想法使用Java 9模块。


我之前尝试回答过这个问题,我使用Vaadin创建了一个类似的应用程序,并成功地使用Tomcat 9进行了部署(然后由我进行了自定义)。不确定从问题中得知,您在尝试部署模块化jar时遇到了什么问题? - Naman
一个现有的模块化 jar 的例子是 jaxb-api.jar 版本 2.3.0 (链接),你可能想在 web 应用程序的 WEB-INF/lib 中使用它,因为 javax.xml.bind 现在已经在 Java API 中被弃用了。 - chris21k
2
@nullpointer:Java 9 提供了 模块化 jar 的功能。使用 java --module-path lib,您可以告诉 jvm 在哪里搜索模块化的 jar。然后,使用 --add-modules one.java.mod.a,您可以将模块 one.java.mod.a 的包(例如在 lib/libx.jar 中)设置到 jvm 的类路径上。只有当 lib/libx.jar 显式地导出模块 one.java.mod.a 时才可能实现此操作。在 lib/libx.jarlib 目录中的其他 jar 中可能存在其他模块(具有其他名称),这些模块也可以从外部访问,例如 one.java.mod.b - chris21k
我有同样的问题,Tomcat 9声称支持Java 9,但在文档中没有任何提及。而现在已经是2018年了... - ARX
@chris21k 这是一种元信息,但是我有点惊讶于 WEB-INF/lib 仍然存在。我有印象单个应用服务器,多个应用程序部署模型已经死亡,随之而来的是使用多个分层类加载器。我最后一次看到单个JVM运行多个Web应用程序(更不用说这些是独立部署的)可能是十年前了。如果单个JVM运行单个应用程序,则可以以正常方式传递模块,而不需要使用一个drop-in目录。关键是:如果不支持这个,我不会感到太惊讶。 - Barend
你是否阅读了相应的Servlet规范? - Thorbjørn Ravn Andersen
2个回答

2

尽管Tomcat不支持运行模块化的WAR文件,但您可以查看Piranha Cloud。

Piranha服务器本身可以在模块路径中运行,并且可以在新的JPMS层中部署WAR文件,同时尊重提供的module-info.class文件。

https://piranha.cloud/blog/2021/20210128_Modular_applications_with_JPMS

免责声明:我是Piranha Cloud开发人员。


-3

Tomcat 9 supports java 9

根据Stack Overflow的帖子-这里,Tomcat 9与Java 9兼容,并且给出了配置步骤。

enter image description here

Tomcat服务器兼容版本 - link


5
原问题是Java 9模块是否被Web应用程序支持(是否符合JEE标准和Tomcat)。Java 9可以运行Tomcat是明确的。请您提供更多上下文或需要翻译的内容。 - chris21k

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接