Я пытаюсь создать простой webapp без какой-либо конфигурации XML, используя Spring 3.1 и встроенный сервер Jetty 8.
Тем не менее, я изо всех сил стараюсь заставить 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; он должен найти Инициализатор и подключить его в...
Однако, когда я запускаю сервер Jetty (из Eclipse), я вижу в командной строке следующее:
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 [email protected]:8080
Важным является бит:
No Spring WebApplicationInitializer types detected on classpath
Обратите внимание, что src/main/java определяется как исходная папка в Eclipse, поэтому должна находиться в пути к классам. Также обратите внимание, что для параметра "Динамический веб-модуль" установлено значение 3.0.
Я уверен, что есть простое объяснение, но я изо всех сил стараюсь увидеть лес для деревьев! Я подозреваю, что ключ имеет следующую строку:
...
webAppContext.setResourceBase("src/main/webapp");
...
Это имеет смысл с 2.5 сервлетом, использующим web.xml(см. ниже), но что это должно быть при использовании AnnotationConfiguration?
NB: все правильно срабатывает, если я изменю конфигурацию на следующее:
...
webAppContext.setConfigurations(new Configuration[] { new WebXmlConfiguration() });
...
В этом случае он находит web.xml в src/main/webapp и использует его для соединения сервлета с использованием DispatcherServlet и AnnotationConfigWebApplicationContext обычным способом (полностью минуя реализацию WebApplicationInitializer выше).
Это очень похоже на проблему с classpath, но я изо всех сил пытаюсь понять, как Jetty ассоциируется с реализациями WebApplicationInitializer - любые предложения будут оценены наиболее высоко!
Для информации, я использую следующее:
Spring 3.1.1 Причал 8.1.7 STS 3.1.0