我有一个带有\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 - 如果这有所不同的话!
答案 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/