2012-09-08 12 views
6

Używam Tomcat 7 razem z CDI i do tego użyłem go-6 servlet-minimal-archetype z Knappsack Maven Archetypes jako punktu wyjścia.Tomcat + CDI + Arquillian

Teraz chciałbym użyć Arquilliana do testowania ziaren CDI, ale nawet po wyszukaniu przez dłuższy czas, znalazłem tylko kilka problemów związanych z tematem.

Czy ktoś może wskazać mi konfigurację roboczą (szczególnie odpowiednią do używania z pom.xml) przy użyciu Arquilliana do testów CDI na Tomcat 7?


Edytowane 11.09.2012: Jak podkreślono w komentarzu poniżej, myślę, że aby rozwiązać mój problem, potrzebuję kogoś, aby mi pomóc zrozumieć całą konfigurację, zamiast próbować rozwiązać szczególny wyjątek w pewnym momencie.

Jak więc powinien wyglądać pom.xml i klasa testowa, aby mieć ziarno CDI w tomcat 7 i być w stanie przetestować je ze wszystkimi mechanizmami wtrysku w osadzonym i zarządzanym pojemniku? (Nawiasem mówiąc, dlaczego nie ma zdalny adapter pojemnik na tomcat 7 już jak to było do 6?)

Próbowałem już dostosować tomcat 6 example, ale nie mogła działać na Tomcat 7.

Odpowiedz

3

Niestety, jeszcze nie znalazłem ani nie powiedziano mi o działającym przykładzie dla mojego problemu, ale udało mi się wymyślić coś, co zadziałało dla mnie, co chcę tutaj pokazać - może to pomaga komuś, odkąd założyłem, że problem nie jest egzotyczny i może ktoś może go przejrzeć i dać mi wskazówkę na wypadek, gdyby coś było inaczej.

/pom.xml (użyteczny w Eclipse [3.7] z tomcat 7 [7.0.30], upewnij się, że Zgromadzenie Właściwości projektu/Wdrożenie nie zawiera klas test/Zasoby):

<?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 (Wciąż używałem wersji 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 (wtrysk serwletów słuchaczy filtrów nie używana)

<?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 (pliki pusty markerów są w identyczny sposób do stosowania i testowania):

<?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 (takie same dla osadzonych i udało):

<?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 (takie same dla osadzonych i udało):

<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 (plik ten jest osadzony tylko) :

<?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 (ten plik jest zarządzana tylko):

<?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> 

Dla udało rozmieszczania pojemnik do pracy, Tomcat tomcat-users.xml plik musi zostać przedłużony, aby umożliwić kierownik, np

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

Na koniec każdy model arquillian test class musi mieć metodę wdrażania w następujący sposób (używam d serwletów 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"); 
    } 
... 

spaw do pakowania, które pochodzą z lokalnego repozytorium maven w swoim przypadku, tak jak w wymienionej przykład na pytanie jest (zmodyfikowane część) według następującego kodu:

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

Oto konfiguracja, która działa dla wersji Tomcat 7 (TomEE) z certyfikatem Java EE. Obejmuje CDI i istnieje kilka roboczych Arquillian adapterów:

Zauważ, że strona wspomina używając właściwości, aby uzyskać prawo portu służącego do wysyłania żądania do Tomcat. Zignoruj ​​to. Prawidłowe podejście to takie pole w teście:

@ArquillianResource 
private URL url; 

To będzie podstawowy adres URL Twojej aplikacji internetowej, portów i wszystkich.

+0

Słyszałem już o TomEE, ale nie zrobię tego w moim przypadku, ponieważ środowisko klienta jest ustawione, a my będziemy mieli tam kocur waniliowy. Ale ponieważ istnieją adaptery dla tomcat 7, zarówno zarządzane, jak i osadzone, i ponieważ istnieją przykłady pracy dla tomcat + CDI, mam nadzieję, że istnieje konfiguracja dla wszystkich trzech - tylko nie znalazłem jeszcze przykładu. –

+0

Istnieje również wersja adaptera, która uruchamia zwykły Tomcat 7, wdraża OpenWebBeans, OpenEJB itd., A następnie wdraża aplikację. Jakiej implementacji CDI używasz? –

+0

Używam Weld, ponieważ jest dostarczany z JBoss 7 (który jest moim preferowanym środowiskiem). –

2

Można spojrzeć na POM dla zarządzanego kontenera Tomcat-7 Arquilliana, który dodaje Weld-Servlet jako zależność testową.

Spawane płatki JAR są ładowane do Arquilliana @Deployment defined in the test classes poprzez ShrinkWrap Maven Dependency Resolver. Będziesz także musiał dołączyć pusty plik beans.xml do wdrożenia. Uwaga - chociaż w klasie testowej nie ma wstrzykiwacza CDI, spoina jest używana do wstrzykiwania @Resource.

+0

Dzięki za podpowiedź, próbowałem dostosować elementy, które wskazałeś, ale to nie zadziałało. Użyłem również [tego] (https://community.jboss.org/wiki/Tomcat6EmbeddedAndRemote) artykułu jako punktu wyjścia, który pokazuje roboczą konfigurację dla tomcat 6 i próbował ją zaadaptować do tomcat 7, ale to nie zadziałało. Czy możesz wskazać mi jakiś działający przykład lub przynajmniej pom, który obejmuje zarówno adapter 7 cquiniana jak i cdi? –

+0

@Geziefer Jaki błąd widzisz lub gdzie jest błąd? –

+0

Chodzi o to, że próbowałem różnych rzeczy i otrzymałem różne wyjątki (ClassNotFound, NoSuchMethod, ...) i ciągle dodam zależności, nie wiedząc, co jest dokładnie potrzebne. Tak więc obawiam się, że jeśli zamieszczę jeden wyjątek, może on zostać rozwiązany tutaj i doprowadzić mnie do następnego, nie wiedząc, że poszedłem w niewłaściwym kierunku. Dlatego przedłużyłem moje pytanie, patrz wyżej. –

Powiązane problemy