与maven,jetty9,spring4和没有web.xml的runnable war

时间:2015-01-20 15:39:15

标签: java spring maven embedded-jetty

我想用Jetty9和Spring4创建一个可运行的战争,并且仍然将它作为可展开的战争(有点像Jenkins

war文件是使用Maven构建的,因此maven-war-plugin将主类(WebAppRunner)移动到文件树的顶部,覆盖战争中的所有jetty- * jar,javax * jars和spring-web.jar(可以访问主类)并在META-INF / MANIFEST.MF中设置主类。

主类如下所示启动Jetty:

ProtectionDomain domain = WebAppRunner.class.getProtectionDomain();
URL location = domain.getCodeSource().getLocation();

WebAppContext context = new WebAppContext();
context.setContextPath( "/" );
context.setWar( location.toExternalForm() );
context.setParentLoaderPriority( true );
context.setConfigurations( new Configuration[] { 
  new AnnotationConfiguration(),
  new WebInfConfiguration(), 
  new WebXmlConfiguration(),
  new MetaInfConfiguration(),
  new PlusConfiguration(), 
  new JettyWebXmlConfiguration() 
} );

Server server = new Server( 8080 );
server.dumpStdErr();
server.setHandler( context );
try {
  server.start();
  server.join();
} catch ( Exception e ) {
  LOG.warn( e );
} 

Jetty本身启动时没有问题,并且在启动WebAppContext scans through WEB-INF/lib and WEB-INF/classes folders inside the war file时启动SpringServletContainerInitializer作为ServletContainerInitializer的实现,而AnnotationConfiguration.getNonExcludedInitializers又应该启动Web应用程序。

但是github方法找不到任何初始化器(ServiceLoader返回空迭代)。

我在1上创建了一个小型演示项目来演示这一点(它仅使用MyAnnotationConfiguration覆盖AnnotationConfiguration以添加日志条目)。您可以使用以下内容构建:

mvn clean compile war:exploded antrun:run war:war

并运行:

java -jar target/myapp.war

或获取更多日志记录:

java -Dorg.eclipse.jetty.LEVEL=DEBUG -jar target/myapp.war

以下是我已经查看的一些文章/问题/来源:2345,{{3} },6789

1 个答案:

答案 0 :(得分:1)

  1. org.eclipse.jetty.annotations.AnnotationConfiguration应该作为最后的配置添加,否则WEB-INF / lib目录中的jar不会添加到类路径中
  2. pom.xml插件中的
  3. 不应该在pluginManagement块中
  4. 删除overlay spring-web