2012-09-08 20 views
6

Uso Tomcat 7 junto con CDI y para eso utilicé el arquetipo mínimo de jee6-servlet desde Knappsack Maven Archetypes como punto de partida.Tomcat + CDI + Arquillian

Ahora me gustaría utilizar Arquillian para probar los beans CDI, pero incluso después de buscar durante bastante tiempo, solo encontré una serie de problemas relacionados con el tema.

¿Alguien me puede indicar una configuración de trabajo (especialmente la derecha pom.xml para usar) usando Arquillian para las pruebas de CDI en Tomcat 7?


Editado 11/09/2012: Como se señaló en un comentario más abajo, creo que para conseguir mi problema resuelto, necesito a alguien que me ayude a comprender toda la instalación, en lugar de tratar de resolver un excepción específica en algún punto.

Entonces, ¿cómo debe ser el pom.xml y la clase de prueba, para tener un frijol CDI en un tomcat 7 y ser capaz de probarlo con todos los mecanismos de inyección en un contenedor incrustado y administrado? (Por cierto, ¿por qué hay ningún adaptador de recipiente a distancia para Tomcat 7 más como lo ha sido durante 6?)

ya he intentado adaptar el tomcat 6 example, pero no podía hacer que funcione en Tomcat 7.

Respuesta

3

Desafortunadamente, todavía no he encontrado o no me han dicho nada acerca de un ejemplo de trabajo para mi problema, pero pude encontrar algo que funcionó para mí, que quiero mostrar aquí. Quizás ayude a alguien, ya que Se supone que el problema no es exótico y que tal vez alguien lo pueda ver y darme una pista en caso de que algo sea diferente.

/pom.xml (utilizable en Eclipse [3.7] con un gato 7 [7.0.30], asegúrese de que el Proyecto Asamblea Propiedades/despliegue no contiene clases de prueba/recursos):

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.mycompany</groupId> 
    <artifactId>cditomcat</artifactId> 
    <packaging>war</packaging> 
    <version>0.0.1-SNAPSHOT</version> 
    <name>cditomcat</name> 
    <description>This pom is the base for a project using JSF2+CDI on a tomcat 7 and Arquillian for tests.</description> 

    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 

    <dependencies> 
     <!-- Java EE Dependencies --> 
     <dependency> 
      <groupId>com.sun.xml.ws</groupId> 
      <artifactId>jaxws-rt</artifactId> 
      <version>2.2.7</version> 
     </dependency> 

     <dependency> 
      <groupId>javax.faces</groupId> 
      <artifactId>jsf-api</artifactId> 
      <version>2.0</version> 
      <scope>compile</scope> 
     </dependency> 

     <dependency> 
      <groupId>com.sun.faces</groupId> 
      <artifactId>jsf-impl</artifactId> 
      <version>2.0.2-b10</version> 
      <scope>compile</scope> 
     </dependency> 

     <dependency> 
      <groupId>javax.validation</groupId> 
      <artifactId>validation-api</artifactId> 
      <version>1.0.0.GA</version> 
      <scope>compile</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-validator</artifactId> 
      <version>4.0.0.GA</version> 
      <scope>compile</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.jboss.weld.servlet</groupId> 
      <artifactId>weld-servlet</artifactId> 
      <version>1.1.4.Final</version> 
     </dependency> 

     <!-- Test dependencies --> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.10</version> 
      <scope>test</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.jboss.arquillian.junit</groupId> 
      <artifactId>arquillian-junit-container</artifactId> 
      <version>1.0.0.CR5</version> 
      <scope>test</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.jboss.shrinkwrap.container</groupId> 
      <artifactId>shrinkwrap-container-tomcat-60</artifactId> 
      <version>1.0.0-beta-1</version> 
      <scope>test</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.jboss.shrinkwrap</groupId> 
      <artifactId>shrinkwrap-api</artifactId> 
      <version>1.0.0-cr-1</version> 
      <scope>test</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.jboss.shrinkwrap</groupId> 
      <artifactId>shrinkwrap-spi</artifactId> 
      <version>1.0.0-cr-1</version> 
      <scope>test</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.jboss.shrinkwrap.descriptors</groupId> 
      <artifactId>shrinkwrap-descriptors-api</artifactId> 
      <version>1.1.0-beta-1</version> 
      <scope>test</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.jboss.shrinkwrap.descriptors</groupId> 
      <artifactId>shrinkwrap-descriptors-impl</artifactId> 
      <version>1.1.0-beta-1</version> 
      <scope>test</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-api</artifactId> 
      <version>1.7.0</version> 
      <scope>test</scope> 
     </dependency> 
    </dependencies> 

    <build> 
     <finalName>cditomcat</finalName> 
     <testSourceDirectory>src/test/java</testSourceDirectory> 

     <plugins> 
      <!-- Facilitates downloading source and javadoc in Eclipse --> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-eclipse-plugin</artifactId> 
       <version>2.8</version> 
       <configuration> 
        <wtpversion>2.0</wtpversion> 
        <downloadSources>true</downloadSources> 
        <downloadJavadocs>true</downloadJavadocs> 
       </configuration> 
      </plugin> 

      <!-- Ensures we are compiling at 1.6 level --> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>2.3.2</version> 
       <configuration> 
        <source>1.6</source> 
        <target>1.6</target> 
       </configuration> 
      </plugin> 

      <!-- Tomcat plugin for embedded tomcat --> 
      <plugin> 
       <groupId>org.codehaus.mojo</groupId> 
       <artifactId>tomcat-maven-plugin</artifactId> 
       <version>1.1</version> 
       <configuration> 
        <path>/${project.build.finalName}</path> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 

    <profiles> 
     <profile> 
      <id>tc7-embedded</id> 
      <activation> 
       <activeByDefault>true</activeByDefault> 
      </activation> 

      <build> 
       <testResources> 
        <testResource> 
         <directory>src/test/resources</directory> 
        </testResource> 
        <testResource> 
         <directory>src/test/resources/embedded</directory> 
        </testResource> 
       </testResources> 
      </build> 

      <dependencies> 
       <dependency> 
        <groupId>org.jboss.arquillian.container</groupId> 
        <artifactId>arquillian-tomcat-embedded-7</artifactId> 
        <version>1.0.0.CR3</version> 
        <scope>test</scope> 
       </dependency> 

       <dependency> 
        <groupId>org.apache.tomcat.embed</groupId> 
        <artifactId>tomcat-embed-core</artifactId> 
        <version>7.0.19</version> 
        <scope>provided</scope> 
       </dependency> 

       <dependency> 
        <groupId>org.apache.tomcat.embed</groupId> 
        <artifactId>tomcat-embed-jasper</artifactId> 
        <version>7.0.19</version> 
        <scope>provided</scope> 
       </dependency> 

       <dependency> 
        <groupId>org.eclipse.jdt.core.compiler</groupId> 
        <artifactId>ecj</artifactId> 
        <version>3.7</version> 
        <scope>test</scope> 
       </dependency> 

       <!-- Provided scoped dependencies for embedded container --> 
       <dependency> 
        <groupId>org.apache.tomcat</groupId> 
        <artifactId>tomcat-catalina</artifactId> 
        <version>7.0.29</version> 
        <scope>provided</scope> 
       </dependency> 

       <dependency> 
        <groupId>org.apache.tomcat</groupId> 
        <artifactId>tomcat-coyote</artifactId> 
        <version>7.0.29</version> 
        <scope>provided</scope> 
       </dependency> 

       <dependency> 
        <groupId>org.apache.tomcat</groupId> 
        <artifactId>tomcat-jasper</artifactId> 
        <version>7.0.29</version> 
        <scope>provided</scope> 
       </dependency> 

       <dependency> 
        <groupId>javax.servlet</groupId> 
        <artifactId>servlet-api</artifactId> 
        <version>2.5</version> 
        <scope>provided</scope> 
       </dependency> 

       <dependency> 
        <groupId>org.jboss.arquillian.container</groupId> 
        <artifactId>arquillian-container-test-spi</artifactId> 
        <version>1.0.2.Final</version> 
        <scope>test</scope> 
       </dependency> 

       <dependency> 
        <groupId>org.jboss.arquillian.container</groupId> 
        <artifactId>arquillian-container-spi</artifactId> 
        <version>1.0.0.CR5</version> 
        <scope>test</scope> 
       </dependency> 
      </dependencies> 
     </profile> 

     <profile> 
      <id>tc7-managed</id> 
      <build> 
       <testResources> 
        <testResource> 
         <directory>src/test/resources</directory> 
        </testResource> 
        <testResource> 
         <directory>src/test/resources/managed</directory> 
        </testResource> 
       </testResources> 
      </build> 

      <dependencies> 
       <dependency> 
        <groupId>org.jboss.arquillian.container</groupId> 
        <artifactId>arquillian-tomcat-managed-7</artifactId> 
        <version>1.0.0.CR3</version> 
        <scope>test</scope> 
       </dependency> 

       <!-- Provided scoped dependencies for embedded container --> 
       <dependency> 
        <groupId>org.apache.tomcat</groupId> 
        <artifactId>tomcat-catalina</artifactId> 
        <version>7.0.29</version> 
        <scope>provided</scope> 
       </dependency> 

       <dependency> 
        <groupId>org.apache.tomcat</groupId> 
        <artifactId>tomcat-coyote</artifactId> 
        <version>7.0.29</version> 
        <scope>provided</scope> 
       </dependency> 

       <dependency> 
        <groupId>org.apache.tomcat</groupId> 
        <artifactId>tomcat-jasper</artifactId> 
        <version>7.0.29</version> 
        <scope>provided</scope> 
       </dependency> 

       <dependency> 
        <groupId>javax.servlet</groupId> 
        <artifactId>servlet-api</artifactId> 
        <version>2.5</version> 
        <scope>provided</scope> 
       </dependency> 

       <dependency> 
        <groupId>org.jboss.arquillian.container</groupId> 
        <artifactId>arquillian-container-test-spi</artifactId> 
        <version>1.0.2.Final</version> 
        <scope>test</scope> 
       </dependency> 

       <dependency> 
        <groupId>org.jboss.arquillian.container</groupId> 
        <artifactId>arquillian-container-spi</artifactId> 
        <version>1.0.0.CR5</version> 
        <scope>test</scope> 
       </dependency> 
      </dependencies> 
     </profile> 
    </profiles> 
</project> 

/src/main/webapp/WEB-INF/web.xml (Todavía utilicé la versión 2.5):

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    version="2.5"> 
    <welcome-file-list> 
     <welcome-file>index.html</welcome-file> 
    </welcome-file-list> 
    <context-param> 
     <param-name>facelets.DEVELOPMENT</param-name> 
     <param-value>true</param-value> 
    </context-param> 
    <servlet> 
     <servlet-name>Faces Servlet</servlet-name> 
     <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>*.jsf</url-pattern> 
    </servlet-mapping> 
    <listener> 
     <listener-class>org.jboss.weld.environment.servlet.Listener</listener-class> 
    </listener> 
    <resource-env-ref> 
     <description>Object factory for the CDI Bean Manager</description> 
     <resource-env-ref-name>BeanManager</resource-env-ref-name> 
     <resource-env-ref-type>javax.enterprise.inject.spi.BeanManager</resource-env-ref-type> 
    </resource-env-ref> 

</web-app> 

/src/main/webapp/META-INF/context.xml (inyección en Servlets, los oyentes, los filtros no se utiliza):

<?xml version="1.0" encoding="UTF-8"?> 
<Context> 
    <!-- disable storage of sessions across restarts --> 
    <Manager pathname=""/> 
    <Resource name="BeanManager" auth="Container" type="javax.enterprise.inject.spi.BeanManager" factory="org.jboss.weld.resources.ManagerObjectFactory"/> 
</Context> 

/src/main/resources/META-INF/beans.xml /src/test/resources/in-container-beans.xml (archivos marcadores vacío son de forma idéntica para la aplicación y la prueba):

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation=" 
     http://java.sun.com/xml/ns/javaee 
     http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> 
</beans> 

/src/test/resources/in-container-web.xml (misma para dispositivos integrados y gestionados):

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    version="2.5"> 

    <env-entry> 
     <env-entry-name>name</env-entry-name> 
     <env-entry-type>java.lang.String</env-entry-type> 
     <env-entry-value>Tomcat</env-entry-value> 
    </env-entry> 

    <listener> 
     <listener-class>org.jboss.weld.environment.servlet.Listener</listener-class> 
    </listener> 

    <resource-env-ref> 
     <resource-env-ref-name>BeanManager</resource-env-ref-name> 
     <resource-env-ref-type>javax.enterprise.inject.spi.BeanManager</resource-env-ref-type> 
    </resource-env-ref> 
</web-app> 

/src/test/resources/in-container-context.xml (misma para dispositivos integrados y gestionados):

<Context> 
    <Resource name="BeanManager" auth="Container" 
     type="javax.enterprise.inject.spi.BeanManager" factory="org.jboss.weld.resources.ManagerObjectFactory" /> 
</Context> 

/src/test/resources/embedded/arquillian.xml (este archivo es sólo incrustado) :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<arquillian xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://jboss.org/schema/arquillian" 
    xsi:schemaLocation="http://jboss.org/schema/arquillian http://jboss.org/schema/arquillian/arquillian_1_0.xsd"> 

    <engine> 
     <property name="deploymentExportPath">target</property> 
    </engine> 
    <container qualifier="tomcat" default="true"> 
     <configuration> 
      <property name="tomcatHome">target/tomcat-embedded-7</property> 
      <property name="workDir">work</property> 
      <property name="appBase">webapps</property> 
      <property name="bindHttpPort">8889</property> 
      <property name="unpackArchive">true</property> 
     </configuration> 
    </container> 
</arquillian> 

/src/test/resources/managed/arquillian.xml (este archivo es de sólo logró):

<?xml version="1.0"?> 
<arquillian 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns="http://jboss.org/schema/arquillian" 
     xsi:schemaLocation="http://jboss.org/schema/arquillian http://jboss.org/schema/arquillian/arquillian_1_0.xsd"> 

    <container qualifier="tomcat" default="true"> 
     <configuration> 
      <property name="jmxPort">8099</property> 
      <property name="host">localhost</property> 
      <property name="port">8080</property> 
      <property name="user">tomcat</property> 
      <property name="pass">manager</property> 
     </configuration> 
    </container> 
</arquillian> 

Para el despliegue de contenedores logrado trabajar, tomcat-users.xml archivo de Tomcat tiene que ser ampliado para que el administrador, por ejemplo:

... 
<role rolename="manager-gui" /> 
    <role rolename="manager-jmx" /> 
    <role rolename="manager-script" /> 
    <user username="tomcat" password="manager" 
     roles="manager-gui,manager-jmx, manager-script" /> 
... 

Finalmente, cada arquillian test class tiene que tener un método de implementación de la siguiente manera (yo uso d Servlet 2.5):

... 
    @Deployment 
    @OverProtocol("Servlet 2.5") 
    public static WebArchive createDeployment() { 
     return ShrinkWrap 
       .create(WebArchive.class, "test.war") 
       .addClass(MyTest.class) 
       .addAsLibrary(
         MavenArtifactResolver 
           .resolve("org.jboss.weld.servlet:weld-servlet:1.1.4.Final")) 
       .addAsWebInfResource("in-container-beans.xml", "beans.xml") 
       .addAsManifestResource("in-container-context.xml", 
         "context.xml").setWebXML("in-container-web.xml"); 
    } 
... 

Weld ha de ser envasado, que se toma desde el repositorio Maven local en mi caso como se ha hecho en el ejemplo de referencia de la pregunta (sección editada) por el siguiente código:

public class MavenArtifactResolver { 
    private static final String LOCAL_MAVEN_REPO = 
      System.getProperty("user.home") + File.separatorChar + 
        ".m2" + File.separatorChar + "repository"; 

    public static File resolve(String groupId, String artifactId, String version) { 
     return new File(LOCAL_MAVEN_REPO + File.separatorChar + 
       groupId.replace(".", File.separator) + File.separatorChar + 
       artifactId + File.separatorChar + 
       version + File.separatorChar + 
       artifactId + "-" + version + ".jar"); 
    } 

    public static File resolve(String qualifiedArtifactId) { 
     String[] segments = qualifiedArtifactId.split(":"); 
     return resolve(segments[0], segments[1], segments[2]); 
    } 
} 
2

Aquí hay una configuración que funciona para la versión certificada Java EE de Tomcat 7 (TomEE). Incluye CDI y hay un puñado de adaptadores Arquillian de trabajo:

Tenga en cuenta que la página menciona el uso de propiedades para obtener el puerto derecho a usar para enviar peticiones a Tomcat. Ignora eso. El enfoque correcto es un campo como este en su caso de prueba:

@ArquillianResource 
private URL url; 

Esa será la URL base de su webapp, puertos y todos.

+0

Ya he oído hablar de TomEE, pero esto no funcionará en mi caso, ya que el entorno del cliente está configurado y tendremos un tomcat vainilla allí. Pero dado que hay adaptadores para Tomcat 7, tanto administrados como incrustados, y dado que hay ejemplos de trabajo para tomcat + CDI, espero que haya una configuración para los tres; solo que todavía no he encontrado un ejemplo. –

+0

También hay una versión del adaptador que inicia Tomcat 7 simple, implementa OpenWebBeans, OpenEJB, etc. y luego implementa la aplicación. ¿Qué implementación de CDI estás usando? –

+0

Uso Weld como viene con JBoss 7 (que es mi entorno preferido). –

2

Puede echar un vistazo al POM para el contenedor administrado Tomcat-7 de Arquillian, que agrega Weld-Servlet como una dependencia de prueba.

Los JAR de soldadura se cargan en el Arquillian @Deployment defined in the test classes a través del Resolvedor de dependencia de ShrinkWrap Maven. También deberá incluir un archivo beans.xml vacío en la implementación. Nota: aunque no se ha inyectado frijol CDI en la clase de prueba, Weld se usa para inyectar el @Resource.

+0

Gracias por la sugerencia, traté de adaptar los elementos que señaló, pero no funcionó. También utilicé [este] (https://community.jboss.org/wiki/Tomcat6EmbeddedAndRemote) artículo como punto de partida, que muestra una configuración de trabajo para tomcat 6 y traté de adaptarlo a tomcat 7, pero no funcionó. ¿Puede indicarme algún ejemplo de trabajo o, al menos, un pom que cubra tanto el adaptador tomcat 7 arquillian como el cdi? –

+0

@Geziefer ¿Qué error está viendo o dónde está la falla? –

+0

La cuestión es que probé cosas diferentes y obtuve excepciones diferentes (ClassNotFound, NoSuchMethod, ...) y sigo agregando dependencias sin saber exactamente lo que se necesita. Entonces, me temo que si publico una excepción, puede resolverse aquí y llevarme al siguiente, sin saber que en un principio fui en la dirección equivocada. Entonces, extendí mi pregunta, por favor, mira arriba. –