Jetty 8:Web 片段 jar 的 /META-INF/resources/WEB-INF/classes 目录可以添加到 Web 应用程序的类路径中吗?

Jetty 8: can a web fragment jar's /META-INF/resources/WEB-INF/classes directory contribute to the web app's classpath?

我创建了一个包含文件的 Servlet 3.0 web 片段 jar:

/META-INF/resources/WEB-INF/classes/com/foo/whatever/i18n.properties

Web 片段在应用程序启动时启用的一个 Servlet 上下文侦听器执行以下代码:

public static final String BUNDLE_BASE_NAME = "com.foo.whatever.i18n";
//... later:
ResourceBundle.getBundle(BUNDLE_BASE_NAME, locale);

这意味着如果最终用户未在其 Web 应用程序的同一路径中指定自己的文件,则应使用 Web 片段的上述 i18n.properties 文件。

这在 Tomcat 7 中有效,但在 Jetty 8 中无效。这是在 Jetty 8 中部署时产生的异常:

java.util.MissingResourceException: Can't find bundle for base name com.foo.whatever.i18n, locale en_US

有没有办法让 Jetty 8 尊重 Web 片段的类路径贡献?

Servlet 规范中没有任何内容表明 WEB-INF/lib 中的 jar 文件可以通过此方法为类路径提供 类。规范讨论了 WEB-INF/lib 中的 jar 文件能够通过其 META-INF/resources 目录贡献静态内容。例如,参见第 4.6 节 "Resources" 第 4-41 页;第 8.2.3 节 "Assembling the descriptor from web.xml, web-fragment.xml and annotations" 第 2 点 5.g.xi 第 8-81 页;第 10.5 节 "Directory Structure" 第 10-104 页;第 10.10 节 "Welcome Files" 第 10-112 页;第 A.3 节 "Changes since Servlet 3.0 Public Review" 第 4 页 A-202.

在规范的其他地方,它指的是 "the"(即单数)WEB-INF 和 WEB-INF/classes 目录。

规范中没有说明如何将 META-INF/resources/WEB-INF/ 目录与主 Web 应用程序中现有的 WEB-INF/ 目录合并(即应该 类 在main WEB-INF/classes dir override 类 of the same name or package in a META-INF/resources/WEB-INF/classes dir?反之亦然?)。然而,正如我之前引用的那样,META-INF/resources 中有关于如何处理资源的明确说明。

另请注意,规范允许通过该机制忽略 META-INF/web-fragment.xmls,但这不会影响类加载:将不会检查被忽略的片段 jar 的注释,并且不会有任何其调用了 ServletContainerInitializers,但是它的 类 将始终在类路径中。

所以简而言之,这似乎是 tomcat 特定的行为。要可靠地获取您的属性文件,您需要将其放入 WEB-INF/lib jar 中的正常位置。您不能使用 Servlet 规范 web-fragment.xml 机制来控制该属性文件是否可见。

问候 一月