Tomcat - 不会加载我的META-INF \ services \ javax.servlet.ServletContainerInitializer文件?

时间:2011-10-07 20:21:51

标签: java eclipse web-applications tomcat

我有一个带有\META-INF\services\javax.servlet.ServletContainerInitializer文件的Web项目,其内容指向实现ServletContainerInitializer接口的类的完全限定名称。我基本上遵循了这里给出的例子:http://nullhaus.com/2011/03/using-servlets-3-0-servletcontainerinitializer/

我在我的类中调试了实现ServletContainerInitializer接口的调试行,它从来没有在那里。甚至不是默认的构造函数......

我的应用程序文件夹结构如下:

\MyApp
      \META-INF\services\javax.servlet.ServletContainerInitializer
      \WEB-INF\classes\
                 ... [list of classes and packages go here]

我需要检查哪些想法?

注1:我的Tomcat从包含我的应用程序的爆炸外部文件夹中发布

注2:我从Eclipse开始使用Tomcat - 如果这有所不同的话!

4 个答案:

答案 0 :(得分:5)

好吧,我认为您需要将初始化类(及其与服务相关的META-INF目录)包装到单独的* .jar中并将其放在WEB-INF/lib中。

这是一个JAR服务,所以我想它可能与在* .war文件中发现服务的问题有关。此外,如果您将META-INF目录放在WEB-INF/classes内并在Tomcat的unpackWAR=false中设置server.xml 甚至无法提供帮助。

HTH。

答案 1 :(得分:3)

要检查的第一件事是您实际上使用的是Servlet 3.0而不是早期版本。对于Tomcat,这意味着您必须使用Tomcat 7.0.22

其次,确保\ META-INF \ services \ javax.servlet.ServletContainerInitializer文件实际存在于爆炸的war文件中。

第三,如果有疑问,直接配置和启动Tomcat(而不是从Eclipse) - 我看到开发人员使用Eclipse插件配置Tomcat时遇到了无穷无尽的问题。

答案 2 :(得分:3)

要让tomcat加载 META-INF 目录,它必须位于classes文件夹中。如果你正在使用maven项目,只需将META-INF目录放在 src / main / resources 目录..在mvn包中同样将被复制到classes目录..不需要separerate jar ..如果罐子是首选,你可以使用 HandlesTypes 注释..

答案 3 :(得分:1)

我想引用Tomcat用户邮件列表中的Mark Thomas <markt@apache.org>的一些很好的解释:

  

服务文件由类加载器从META-INF / services加载   目录。

     

*。jar!/ META-INF / services   和   * .war / WEB-INF / classes / META-INF / services   对类加载器可见

     

*。war!/ META-INF / services   不是。

     

servlet专家组最近在以下方面讨论了WAR与JAR:   Java 9和多版本JAR。结论是(我在解释)   WAR不是JAR的一种特殊形式,尽管它们共享一个   通用格式JAR可用的功能不会自动生成   除非对Servlet规范(Java EE规范)有明确规定,否则对WAR可用   另有说明。

     

如果愿意,容器可以自由添加特定于容器的扩展名   但是它们带有通常的(缺乏)互操作性警告。

http://mail-archives.apache.org/mod_mbox/tomcat-users/201808.mbox/