Spring 3.1 と組み込みの Jetty 8 サーバーを使用して、XML 構成なしで単純な webapp を作成しようとしています。
ただし、Spring WebApplicationInitializerインターフェイスの実装を Jetty に認識させるのに苦労しています。
プロジェクトの構造:
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 のソース フォルダーとして定義されているため、クラスパスにある必要があります。また、動的 Web モジュール ファセットが 3.0 に設定されていることにも注意してください。
簡単な説明があると思いますが、木のために木を見るのに苦労しています!キーは次の行にあると思われます。
...
webAppContext.setResourceBase("src/main/webapp");
...
これは web.xml を使用する 2.5 サーブレットでは理にかなっていますが (以下を参照)、AnnotationConfigurationを使用する場合はどうすればよいでしょうか?
注意: 構成を次のように変更すると、すべてが正しく起動します。
...
webAppContext.setConfigurations(new Configuration[] { new WebXmlConfiguration() });
...
この場合、src/main/webappの下にあるweb.xmlを見つけ、それを使用して、通常の方法でDispatcherServletとAnnotationConfigWebApplicationContextを使用してサーブレットを接続します(上記のWebApplicationInitializer実装を完全にバイパスします)。
これはクラスパスの問題のように感じますが、Jetty がWebApplicationInitializerの実装とどのように関連付けられているかを理解するのに苦労しています - どんな提案でも大歓迎です!
情報については、次のものを使用しています。
春 3.1.1 桟橋 8.1.7 STS 3.1.0