【发布时间】:2012-10-24 16:42:50
【问题描述】:
我正在尝试使用 Spring 3.1 和嵌入式 Jetty 8 服务器创建一个没有任何 XML 配置的简单 webapp。
但是,我很难让 Jetty 识别我的 Spring WebApplicationInitializer 接口的实现。
项目结构:
src
+- main
+- java
| +- JettyServer.java
| +- Initializer.java
|
+- webapp
+- web.xml (objective is to remove this - see below).
上面的Initializer类是WebApplicationInitializer的简单实现:
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import org.springframework.web.WebApplicationInitializer;
public class Initializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
System.out.println("onStartup");
}
}
同样,JettyServer 是嵌入式 Jetty 服务器的简单实现:
import org.eclipse.jetty.annotations.AnnotationConfiguration;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.webapp.Configuration;
import org.eclipse.jetty.webapp.WebAppContext;
public class JettyServer {
public static void main(String[] args) throws Exception {
Server server = new Server(8080);
WebAppContext webAppContext = new WebAppContext();
webAppContext.setResourceBase("src/main/webapp");
webAppContext.setContextPath("/");
webAppContext.setConfigurations(new Configuration[] { new AnnotationConfiguration() });
webAppContext.setParentLoaderPriority(true);
server.setHandler(webAppContext);
server.start();
server.join();
}
}
我的理解是,Jetty 在启动时会使用 AnnotationConfiguration 来扫描 ServletContainerInitializer 的注释实现;它应该找到 Initializer 并将其连接到...
但是,当我(从 Eclipse 中)启动 Jetty 服务器时,我在命令行上看到以下内容:
2012-11-04 16:59:04.552:INFO:oejs.Server:jetty-8.1.7.v20120910
2012-11-04 16:59:05.046:INFO:/:No Spring WebApplicationInitializer types detected on classpath
2012-11-04 16:59:05.046:INFO:oejsh.ContextHandler:started o.e.j.w.WebAppContext{/,file:/Users/duncan/Coding/spring-mvc-embedded-jetty-test/src/main/webapp/}
2012-11-04 16:59:05.117:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:8080
重要的是:
No Spring WebApplicationInitializer types detected on classpath
请注意,src/main/java 在 Eclipse 中被定义为源文件夹,因此应该位于类路径中。另请注意,Dynamic Web Module Facet 设置为 3.0。
我确信有一个简单的解释,但我很难只见树木不见森林!我怀疑关键在于以下行:
...
webAppContext.setResourceBase("src/main/webapp");
...
这对于使用 web.xml 的 2.5 servlet 是有意义的(见下文),但是使用 AnnotationConfiguration 时应该是什么?
注意:如果我将配置更改为以下内容,一切都会正确启动:
...
webAppContext.setConfigurations(new Configuration[] { new WebXmlConfiguration() });
...
在这种情况下,它会在 src/main/webapp 下找到 web.xml 并使用它通过 DispatcherServlet 和 连接 servlet em>AnnotationConfigWebApplicationContext 以通常的方式(完全绕过上面的 WebApplicationInitializer 实现)。
这感觉很像一个类路径问题,但我很难理解 Jetty 如何将自己与 WebApplicationInitializer 的实现联系起来 - 任何建议都将不胜感激!
有关信息,我正在使用以下内容:
春季 3.1.1 码头 8.1.7 STS 3.1.0
【问题讨论】:
标签: java spring-mvc jetty embedded-jetty jetty-8