我正在使用Jetty 9.1.0.RC2和Spring 4。
有一个AbstractAnnotationConfigDispatcherServletInitializer
并试图通过以下方式启动初始化:
Server server = new Server();
WebAppContext webAppContext = new WebAppContext();
webAppContext.setContextPath("/");
webAppContext.setConfigurations(new Configuration[] { new AnnotationConfiguration() });
webAppContext.setParentLoaderPriority(true);
webAppContext.setAttribute("org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern", ".*/target/classes/.*");
server.setHandler(webAppContext);
server.start();
server.join();
但未能发现:
No Spring WebApplicationInitializer types detected on classpath
答案 0 :(得分:0)
这是一个常见问题。更多人正面临这个问题。有时它会导致错误,或者有时会产生info
。 对于信息,没有问题(就像警告一样)。 对于错误,发生此错误的原因有很多种。我想给你一些解决方案。
Generated .class files compatibility: 1.6
","来源
兼容性:1.6"。src/main/webapp/WEB-INF
它也会解决
这个问题。如果未选择"Project -> Build Automatically"
。你可以强迫
" m2e-wtp文件夹和内容"一代又一代;
"(右击 在你的项目上) - > Maven - >更新项目......"
注意:确保 "清洁项目"选项未选中。否则内容 目标/班级将被删除,您将回到原点。
将WebROOT文件目录添加到默认目录,然后执行此操作 问题将得到解决。
属性 - > MyEclipse->部署 总成 - >添加
对于tomcat,
tomcat7
插件,但JRE环境为1.6。然后
出现这个问题。然后,您需要将tomcat7
降级为tomcat6
或者将jdk和jre版本升级到1.7。stop your tomcat
。然后是clean the project
,
clean the server
和run again your project
。有时缓存可以做到这一点
问题。按照这种方式,它可以解决。对于JBOSS,
@ Sotirios Delimanolis
给出了一个非常好的答案。具体如下:
在典型的servlet应用程序中,您将拥有一个web.xml
描述符文件来声明serlvets, filters, listeners, context params, security configuration, etc
。为您的应用程序。自servlet 3.0
以来,您可以通过编程方式完成大部分工作。
Servlet 3.0
提供了您可以实现的界面ServletContainerInitializer
。您的servlet容器将在META-INF/services/javax.servlet.ServletContainerInitializer
文件中查找该类的实现,实例化它,并调用其onStartup()
方法。
Spring在该界面之上构建了WebApplicationInitializer,作为adapter/helper
。
您需要web.xml
描述符或实现WebApplicationInitializer
的类来设置和运行您的应用程序。
Spring WebApplicationInitializer - how it works and what may go wrong
启动没有web.xml的servlet上下文
版本3的Servlet可以以编程方式配置,不需要任何web.xml
。
使用Spring及其Java配置,您可以创建一个实现org.springframework.web.WebApplicationInitializer
的配置类。
Spring将自动查找实现此接口的所有类,并启动相应的servlet上下文。更令人兴奋的是它不是Spring来搜索那些类,它是servlet容器(例如jetty或tomcat)。
类org.springframework.web.SpringServletContainerInitializer
注释为
@javax.servlet.annotation.HandlesTypes(WebApplicationInitializer.class
)
和实现javax.servlet.ServletContainerInitializer
根据Servlet 3规范,容器将在实现该接口的类路径中的每个类上调用org.springframework.web.SpringServletContainerInitializer.onStartup(Set<Class<?>>, ServletContext)
,提供HandlesTypes中定义的一组类
启动顺序,如果有多个上下文
如果有多个类实现WebApplicationInitializer
,则可以使用注释org.springframework.core.Ordered
控制它们的启动顺序。
可能出错的事情
类路径中的不同Spring版本
如果类路径中有WebApplicationInitializer
的不同版本,则servlet容器可能会扫描实现版本&#39; A&#39; 的WebApplicationInitializer
的类,而您的配置类实现版本&#39; B&#39; 的WebApplicationInitializer
。而且找不到你的配置类,也不会启动sercletontexts。
类路径中出现意外的WebApplicationInitializers
不要将任何WebApplicationInitializers
打包到以后可能在其他Web应用程序的类路径中的jar或wars中。当你不期望它们时,它们可能会被找到并启动。当我用Maven将WebApplicationInitializers
打包到测试罐中时,这种情况发生在我身上,并被其他测试重用。
对类路径中的许多类
servlet容器必须扫描类路径,类越多,所需的时间越长。 至少Jetty有一个内置超时,所以你可能会得到一个
javax.websocket.DeploymentException thrown by
org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer
解决方案是告诉jetty哪些罐子要扫描。这将使 启动速度更快,避免超时。在Maven,你可以做到 像这样:
<plugin>
<groupId> org.eclipse.jetty</groupId >
<artifactId> jetty-maven-plugin</artifactId >
<configuration>
<webAppConfig>
<contextPath> /${project.artifactId}</contextPath >
<webInfIncludeJarPattern> busines-letter-*.</webInfIncludeJarPattern >
</webAppConfig>
春季采伐
配置日志后,您应该在日志中找到以下条目之一:
如果Spring根本找不到WebApplicationInitializer
,您将在日志中看到:
No Spring WebApplicationInitializer types detected on classpath
如果Spring找到至少一个WebApplicationInitializer
,您会看到:
Spring WebApplicationInitializers detected on classpath: " + initializers