带Jetty的AbstractAnnotationConfigDispatcherServletInitializer

时间:2014-03-05 16:50:06

标签: java spring spring-mvc embedded-jetty

我正在使用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

1 个答案:

答案 0 :(得分:0)

这是一个常见问题。更多人正面临这个问题。有时它会导致错误,或者有时会产生info对于信息,没有问题(就像警告一样)。 对于错误,发生此错误的原因有很多种。我想给你一些解决方案。

  1. 有时spring库和jdk版本不匹配会导致此错误。 类是在较低版本的jdk中构建的,并尝试在上层运行 版本可能会导致错误。然后我们需要使用Eclipse进行更改 来自Preferences \ Java \ Compiler我们必须设置"编译器合规性 等级:1.7"和" Generated .class files compatibility: 1.6","来源 兼容性:1.6"。
  2. 有些人认为 log4j未配置为捕获错误 在后台抛出配置错误的输出。
  3. 如果您使用的是maven,那么WEB-INF目录必须在您的内部 Web应用程序。结构将是src/main/webapp/WEB-INF它也会解决 这个问题。
  4. 如果未选择"Project -> Build Automatically"。你可以强迫 " m2e-wtp文件夹和内容"一代又一代;

    "(右击     在你的项目上) - > Maven - >更新项目......"

  5.   

    注意:确保       "清洁项目"选项未选中。否则内容       目标/班级将被删除,您将回到原点。

    1. 将WebROOT文件目录添加到默认目录,然后执行此操作 问题将得到解决。

      属性 - > MyEclipse->部署     总成 - >添加

    2. 资源链接:

      1. No Spring WebApplicationInitializer types detected on classpath
      2. INFO: No Spring WebApplicationInitializer types detected on classpath
      3. only one error: No Spring WebApplicationInitializer types detected on classpath
      4. 对于tomcat,

        1. 如果maven有tomcat7插件,但JRE环境为1.6。然后 出现这个问题。然后,您需要将tomcat7降级为tomcat6 或者将jdk和jre版本升级到1.7。
        2. 有时需要stop your tomcat。然后是clean the projectclean the serverrun again your project。有时缓存可以做到这一点 问题。按照这种方式,它可以解决。
        3. 对于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的类来设置和运行您的应用程序。

          资源链接:

          1. Jboss No Spring WebApplicationInitializer types detected on classpath
          2. 以下简要回答Jetty:

            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,你可以做到   像这样:

            的pom.xml

            <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