spring - WebApplicationInitializer 未在 jetty+selenium 上启动

标签 spring jetty gradle embedded-jetty

我正在尝试使用 gradle 在 jetty 上运行 selenium 测试,我的 gradle 配置如下:

gradle.build:

apply plugin: 'java'
apply plugin: 'eclipse-wtp'
apply plugin: 'war'
apply plugin: 'findbugs'
//apply from:'http://github.com/breskeby/gradleplugins/raw/master/emmaPlugin/emma.gradle'
apply from: 'emma.gradle'
apply plugin: 'jetty'

sourceCompatibility = 1.7
version = ''

sourceSets {
    selenium
}

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'org.gradle.api.plugins:gradle-cargo-plugin:0.6'
    }
}

repositories {
    mavenCentral()
    mavenRepo url: 'http://repository.primefaces.org'
    mavenRepo url: 'http://repository.jboss.org/nexus/content/groups/public'
    mavenRepo url: 'http://repository.jboss.org/maven2'
    mavenRepo url: 'http://maven.springframework.org/release'
    mavenRepo url: 'http://repo1.maven.org/maven2'
    mavenRepo url: 'http://git.solutionstream.com/nexus/content/repositories/thirdparty'
}

dependencies {
    //JSF
    compile group: 'com.sun.faces', name: 'jsf-api', version: '2.1.22'
    compile group: 'com.sun.faces', name: 'jsf-impl', version: '2.1.22'
    compile 'org.ocpsoft.rewrite:rewrite-servlet:2.0.3.Final'
    compile 'org.ocpsoft.rewrite:rewrite-config-prettyfaces:2.0.3.Final'
    compile 'javax.el:el-api:2.2'
    runtime 'org.glassfish.web:el-impl:2.2'


    //Servlet
    compile group: 'javax.servlet', name: 'jstl', version: '1.2'
    providedCompile group: 'org.jboss.spec', name: 'jboss-javaee-6.0', version: '1.0.0.Final'
    compile 'taglibs:standard:1.1.2'
    compile group: 'org.springframework', name: 'spring-web', version: '3.2.2.RELEASE'

    //Omnifaces
    compile 'org.omnifaces:omnifaces:1.5'

    //Prime Faces
    compile group: 'org.primefaces', name: 'primefaces', version: '4.0-SNAPSHOT'
    compile 'org.primefaces.themes:bootstrap:1.0.10'

    // DB
    compile group: 'org.springframework.data', name: 'spring-data-jpa', version: '1.3.1.RELEASE'
    compile group: 'org.springframework', name: 'spring-aspects', version: '3.2.2.RELEASE'
    compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.9'

    compile group: 'javax.inject', name: 'javax.inject', version: '1'
    compile group: 'javax.enterprise', name: 'cdi-api', version: '1.0-SP4'
    compile 'cglib:cglib-nodep:2.2.2'

    //Hibernate / JPA   
    compile 'org.hibernate:hibernate-core:4.1.0.Final'
    compile 'org.hibernate:hibernate-entitymanager:4.1.0.Final'
    compile 'org.hibernate.javax.persistence:hibernate-jpa-2.0-api:1.0.1.Final'
    //JSR-303
    compile 'org.hibernate:hibernate-validator:4.3.1.Final'

    // Spring Security
    compile 'org.springframework.security:spring-security-core:3.1.4.RELEASE'
    compile 'org.springframework.security:spring-security-web:3.1.4.RELEASE'
    compile 'org.springframework.security:spring-security-config:3.1.4.RELEASE'

    //Utility
    compile 'com.google.guava:guava:14.0.1'
    compile 'commons-lang:commons-lang:2.6'
    compile 'org.apache.commons:commons-email:1.3.1'
    compile 'com.typesafe:config:1.0.0'
    compile 'joda-time:joda-time:2.2'
    compile 'org.apache.geronimo.javamail:geronimo-javamail_1.4_mail:1.8.3'
    compile 'org.slf4j:slf4j-api:1.7.2'
    compile 'org.slf4j:jcl-over-slf4j:1.7.2'
    compile 'org.slf4j:slf4j-log4j12:1.7.2'


    //Mustache Templates
    compile 'com.github.jknack:handlebars:1.0.0'

    //Projects
    //compile project(":ExtraValidators")

    ////TESTING DEPENDENCIES
    testCompile 'com.googlecode.jmockit:jmockit:1.2'
    testCompile group: 'junit', name: 'junit', version: '4.11'
    testCompile 'com.h2database:h2:1.3.172'

    //Spring Testing
    testCompile 'org.springframework:spring-test:3.2.3.RELEASE'

    /* Selenium */
    seleniumCompile 'org.seleniumhq.selenium:selenium-java:2.33.0'
    seleniumCompile 'junit:junit:4.11'
}

task wrapper(type: Wrapper){
    gradleVersion = '1.5'
}

eclipse {
    classpath {
       downloadSources=true
       plusConfigurations += configurations.seleniumCompile
    }
}


task jettyDaemon(type: org.gradle.api.plugins.jetty.JettyRun) {
    daemon = true
}

task selenium(type: Test, dependsOn: jettyDaemon) {
    testClassesDir = sourceSets.selenium.output.classesDir
    classpath = sourceSets.selenium.runtimeClasspath
}

WebApplicationInitializer :
package com.myapp.web.config;

import javax.faces.application.ProjectStage;
import javax.servlet.FilterRegistration;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.ContextLoader;
import org.springframework.web.context.request.RequestContextListener;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.filter.DelegatingFilterProxy;

import com.myapp.data.config.SpringConfig;
import com.myapp.data.config.SpringJNDIDataConfig;
import com.myapp.data.config.SpringJNDIJPAConfig;
import com.myapp.data.config.SpringSecurityConfig;
import com.myapp.data.config.SpringWebConfig;
import com.myapp.utils.configuration.ConfigurationUtil;

public class WebappConfig implements WebApplicationInitializer {

   protected final Logger logger = LoggerFactory.getLogger(getClass());

   @Override
   public void onStartup(final ServletContext servletContext) throws ServletException {



       if(logger.isDebugEnabled()) {
         logger.debug("Starting web context configuration");
      }

      AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
      // rootContext.getEnvironment().setActiveProfiles("production");
      rootContext.register(SpringConfig.class, SpringSecurityConfig.class, SpringWebConfig.class, SpringJNDIDataConfig.class, SpringJNDIJPAConfig.class);

      servletContext.addListener(RequestContextListener.class);

      new ContextLoader(rootContext).initWebApplicationContext(servletContext);

      addFilters(servletContext, rootContext.getEnvironment());

      servletContext.setInitParameter(ProjectStage.PROJECT_STAGE_PARAM_NAME, ConfigurationUtil.config().getString("jsf.stage"));
      servletContext.setInitParameter("javax.faces.FACELETS_REFRESH_PERIOD", ConfigurationUtil.config().getString("jsf.refreshPeriod"));
   }

   private void addFilters(final ServletContext servletContext, final ConfigurableEnvironment configurableEnvironment) {
      FilterRegistration.Dynamic securityFilter = servletContext.addFilter("springSecurityFilterChain", new DelegatingFilterProxy("springSecurityFilterChain"));
      securityFilter.addMappingForUrlPatterns(null, false, "/*");
   }

}

请告知在 jetty 上运行 Selenium 测试时如何使 WebApplicationInitializer 运行。

最佳答案

WebApplicationInitializer需要一个 Servlet 3 容器。但是,Gradle 的 Jetty 插件基于 Jetty 6,它仅支持 Servlet 2.5。

你有几个选择:

  • 使用 web.xml 配置您的应用程序文件而不是 WebApplicationInitializer
  • 在 Gradle 中使用更新的 Jetty 版本。 GRADLE-1956 的评论中有一些变通方法
  • 使用替代容器,如 Tomcat (gradle-tomcat-plugin)
  • 使用替代插件,如 gradle-cargo-pluginarquillian-gradle-plugin . AFAIK 有一个新的 gradle 部署插件正在开发中,它应该基于 Arquillian .
  • 关于spring - WebApplicationInitializer 未在 jetty+selenium 上启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17370176/

    相关文章:

    java - Jetty + Derby 未找到合适的司机

    java - 创建一个与默认 Jetty 的 Jersey 注册行为相同的 ResourceConfig

    gradle 将嵌套的 jar 依赖项捆绑到模块输出 jar 中

    android - 在 gradle 构建期间更新 README.md 中的版本号

    java - 在 session 范围内的 spring-bean 中同步实例变量以限制对遗留服务的并发请求

    java - 设置Spring Boot可执行jar的工作目录

    java - 无法在Spring Boot和Data JPA中使用 native 查询方法访问数据记录

    clojure/ring/jetty : I am using > lein ring server. 如何配置实例化的 jetty 实例?

    android - 将 Android Studio 更新到 3.1.2 后,Gradle 构建失败

    spring - 在 Spring 项目中使用 Maven 进行集成测试