Jetty 8:可以创建web片段jar';s/META-INF/resources/WEB-INF/classes目录对WEB应用程序的贡献';什么是类路径?

Jetty 8:可以创建web片段jar';s/META-INF/resources/WEB-INF/classes目录对WEB应用程序的贡献';什么是类路径?,jetty,servlet-3.0,web-inf,jetty-8,web-fragment,Jetty,Servlet 3.0,Web Inf,Jetty 8,Web Fragment,我创建了一个Servlet 3.0 web片段jar,其中包含一个文件: /META-INF/resources/WEB-INF/classes/com/foo/where/i18n.properties 应用程序启动时web片段启用的一个Servlet上下文侦听器执行以下代码: public static final String BUNDLE_BASE_NAME = "com.foo.whatever.i18n"; //... later: ResourceBundle.getBundle(

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

/META-INF/resources/WEB-INF/classes/com/foo/where/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
文件

这在Tomcat7中起作用,但在Jetty8中不起作用。这是在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页;第82.3节:“从Web.xml、WebScript、XML和注释组装描述符”点2.5.G.PG 8-81.第10.5节“目录结构”第10-104页;第10.10节“欢迎文件”第10-112页;第A.3节“自Servlet 3.0公开审查以来的变化”第4页A-202

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

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

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

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

问候
Jan

Tomcat默认允许这样做是一个bug。该缺陷将在下一版本中修复。如果您需要此功能,那么应该可以使用Tomcat特定的配置恢复等效的行为!我确实将文件放在了jar的“普通”类路径位置,即我的plugin.jar:com/foo/which/i18n.properties中,并且在Tomcat和Jetty中(我希望,可能也在其他容器中)工作正常。