Jetty 8:web片段jar的/ META-INF / resources / WEB-INF / classes目录可以为Web应用程序的类路径做出贡献吗?

时间:2015-01-21 23:36:54

标签: jetty servlet-3.0 web-inf jetty-8 web-fragment

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

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

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

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

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

这适用于Tomcat 7,但不适用于Jetty 8.这是在Jetty 8中部署时产生的异常:

  

java.util.MissingResourceException:无法找到基本名称com.foo.whatever.i18n的捆绑包,locale en_US

有没有办法让Jetty 8兑现网络片段的类路径贡献?

1 个答案:

答案 0 :(得分:5)

Servlet规范中没有任何内容表明WEB-INF / lib中的jar文件可以通过此方法为类路径提供类。规范谈到WEB-INF / lib中的jar文件能够通过其META-INF / resources目录提供静态内容。例如,参见第4.6节“资源”第4-41页;第8.2.3节“从web.xml,web-fragment.xml和注释中组装描述符”指向2.5.g.xi第8-81页;第10.5节“目录结构”第10-104页;第10.10节“欢迎文件”第10-112页;第A.3节“自Servlet 3.0公众评论以来的变化”第4页第A-202页。

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

规范中没有关于如何将META-INF / resources / WEB-INF /目录与主webapp中的现有WEB-INF / dir合并的说明(即主要WEB-INF /类中的类) dir覆盖META-INF / resources / WEB-INF / classes目录中相同名称或包的类?反之亦然?)。然而,正如我之前所述,有明确说明如何处理META-INF /资源中的资源。

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

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

问候 扬