Jetty 8:Web 片段 jar 的 /META-INF/resources/WEB-INF/classes 目录能否为 Web 应用的类路径做出贡献?



我创建了一个包含文件的 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: 找不到基本名称 com.foo.whatever.i18n、locale en_US 的捆绑包

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

Servlet 规范中没有任何内容表明 WEB-INF/lib 中的 jar 文件可以通过此方法向类路径贡献类。规范讨论了 WEB-INF/lib 中的 jar 文件能够通过其 META-INF/resources 目录贡献静态内容。例如,请参阅第 4.6 节"资源"第 4-41 页; 第 8.2.3 节"从 web.xml、Web 片段和注释中汇编描述符.xml"第 2.5.g.xi 点,第 8-81 页; 第 10.5 节"目录结构"第 10-104 页;第 10.10 节"欢迎文件"第 10-112 页;第 A.3 节"自 Servlet 3.0 公众审查以来的变化"第 4 点,第 A-202 页。

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

规范中没有关于如何将 META-INF/resources/WEB-INF/目录与主 Web 应用程序中的现有 WEB-INF/目录合并的说明(即主 WEB-INF/类目录中的

类是否应该覆盖 META-INF/resources/WEB-INF/classes 目录中的同名或包?反之亦然?然而,正如我之前引用的那样,有关于如何处理 META-INF/resources 中的资源的明确说明。

另请注意,规范允许通过该机制忽略 META-INF/web-fragment.xmls,但这不会影响类加载:忽略的片段 jar 不会被检查注释,也不会调用任何 ServletContainerInitializer,但它的类将始终位于类路径上。

简而言之,这似乎是雄猫特有的行为。为了可靠地拾取您的属性文件,您需要将其放入 WEB-INF/lib jar 中的正常位置。不能使用 Servlet 规范 Web 片段.xml机制来控制该属性文件是否可见。

问候一月

最新更新