5

Me gustaría probar nuestro servicio REST con solicitudes HTTP (un poco de prueba de blackbox). Sin embargo, después de un par de horas buscando en Google y probando diferentes configuraciones, todavía no puedo iniciar Jetty correctamente. Esta es la configuración de mi corriente (I intentado varias versiones diferentes):Configuración de pruebas de integración utilizando Spring/Jetty (o Tomcat)/Maven para pruebas REST

pom.xml

 ... 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <version>2.8</version> 
      <configuration> 
       <junitArtifactName>junit:junit</junitArtifactName> 
       <excludes> 
        <exclude>**/*_Roo_*</exclude> 
        <exclude>**/*Util*</exclude> 
        <exclude>**/*IT*</exclude> 
       </excludes> 
       <forkMode>once</forkMode> 
       <argLine>-javaagent:'${settings.localRepository}/org/springframework/spring-instrument/${org.springframework-version}/spring-instrument-${org.springframework-version}.jar' -javaagent:'${settings.localRepository}/org/aspectj/aspectjweaver/${org.aspectj-version}/aspectjweaver-${org.aspectj-version}.jar'</argLine> 
       <useSystemClassLoader>true</useSystemClassLoader> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-failsafe-plugin</artifactId> 
      <version>2.8</version> 
      <configuration> 
       <forkMode>once</forkMode> 
       <argLine>-javaagent:'${settings.localRepository}/org/springframework/spring-instrument/${org.springframework-version}/spring-instrument-${org.springframework-version}.jar' -javaagent:'${settings.localRepository}/org/aspectj/aspectjweaver/${org.aspectj-version}/aspectjweaver-${org.aspectj-version}.jar'</argLine> 
       <useSystemClassLoader>false</useSystemClassLoader> 
      </configuration> 
      <executions> 
       <execution> 
        <id>integration-test</id> 
        <goals> 
         <goal>integration-test</goal> 
        </goals> 
       </execution> 
       <execution> 
        <id>verify</id> 
        <goals> 
         <goal>verify</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
     <plugin> 
      <groupId>org.mortbay.jetty</groupId> 
      <artifactId>maven-jetty-plugin</artifactId> 
      <version>6.1.10</version> 
      <configuration> 
       <scanintervalseconds>10</scanintervalseconds> 
       <stopkey>foo</stopkey> 
       <stopport>9999</stopport> 
       <contextpath>/${project.artifactId}</contextpath> 
       <connectors> 
        <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector"> 
         <port>9090</port> 
        </connector> 
       </connectors> 
      </configuration> 
      <executions> 
       <execution> 
        <id>start-jetty</id> 
        <phase>pre-integration-test</phase> 
        <goals> 
         <goal>run</goal> 
        </goals> 
        <configuration> 
         <scanintervalseconds>0</scanintervalseconds> 
         <daemon>true</daemon> 
        </configuration> 
       </execution> 
       <execution> 
        <id>stop-jetty</id> 
        <phase>post-integration-test</phase> 
        <goals> 
         <goal>stop</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
     ... 

orm.xml

<!-- <context:load-time-weaver/> --> 
<context:load-time-weaver weaver-class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/> 
<context:spring-configured/> 
<context:annotation-config /> 
<context:component-scan base-package="com.example.jump.domain"> 
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/> 
</context:component-scan> 
    <tx:annotation-driven transaction-manager="transactionManager" /> 

En este momento, estoy consiguiendo la excepción:

  • java.lang.IllegalStateException: ClassLoader [org.mortbay.jetty.webapp.WebAppClassLoader] NO proporciona un 'addTransformer (clase Método FileTransformer) '. Especificar un LoadTimeWeaver costumbre o iniciar su máquina virtual de Java con el agente de primavera: -javaagent: org.springframework.instrument.jar

entiendo la excepción, pero yo no era capaz de arreglarlo. También intenté un par de otros enfoques, como dar el javaagent a través de MAVEN_OPTS o intentar establecer VM args en Jetty. El problema es que Google devuelve un montón de 'soluciones' para diferentes versiones y ninguna funcionaba.

Actualmente estoy bastante frustrado de que un escenario común como las pruebas de servicios REST sea tan difícil de lograr en la primavera. Entonces, si eres lo suficientemente inteligente como para encontrar la configuración correcta, por favor, compártela de una manera que incluso un mono pueda configurar y prometo que si alguna vez nos encontramos con las cervezas están conmigo.

Estas son las versiones que utilizo:

<properties> 
    <java-version>1.6</java-version> 
    <org.springframework-version>3.0.5.RELEASE</org.springframework-version> 
    <org.aspectj-version>1.6.9</org.aspectj-version> 
    <org.slf4j-version>1.5.10</org.slf4j-version> 
    <redis.version>1.0.0.BUILD-SNAPSHOT</redis.version> 
    <org.jboss.hibernate.version>3.6.0.Final</org.jboss.hibernate.version> 
    <net.sf.ehcache.version>2.3.1</net.sf.ehcache.version> 
</properties> 

Maven 2.21

con mucho gusto dar más información si es necesario. Como dije, cada ayuda apreciada.

+0

¿Necesita tejer el tiempo de carga para la prueba de integración? – sourcedelica

+0

Buscando en Google parece que MAVEN_OPTS es el camino a seguir y debe asegurarse de que no haya espacios en su camino hacia el contenedor. – sourcedelica

+0

Como escribí, hice google mucho y también encontré MAVEN_OPTS, sin embargo, ninguna solución funcionó, no había espacios en el camino. – hjuskewycz

Respuesta

0

Tengo problemas con Jetty.

Si usted es como yo usando Tomcat sin problemas para el desarrollo, le aconsejaría que se adhiera a tomcat para probarlos automáticamente.
Ejemplo de uso de Jetty en diferentes tutoriales funciona muy bien porque su aplicación de ejemplo. es más simple (hello world jsp ...).

Para la aplicación en el mundo real, la configuración de embarcadero es más complicada y los beneficios de usarla desaparecen con eso.

Jetty requiere configuración de otros que con la de Tomcat.
Así que es un dolor en ... mantener esto y no encontré ningún valor con su documentación deficiente.

Estoy utilizando ahora un tomcat local con carga: comience a ejecutarlos, pare el gato. No necesita aprender cosas de embarcadero solo reutilice su configuración real de tomcat.
El único prerrequisito es tener Tomcat ya instalado en su máquina y una variable de entorno que lo señale.

Incluso puede omitir eso y descargarlo automáticamente la primera vez con una configuración de carga.

3

Esto no está realmente relacionado con los servicios ReST, y solo está relacionado incidentalmente con Spring. Su problema se centra en AspectJ y habilita el entrelazado en tiempo de carga en la JVM. Usted dice que entiende la excepción, pero no estoy seguro de que lo haga. ¿Has leído la sección Load-time weaving with AspectJ en la referencia de Spring? Preste especial atención al environment-specific configuration. El problema es que la implementación de JetLoader ClassLoader no es compatible con la transformación de clase, y no conozco ninguna alternativa que lo haga, por lo que la única opción que queda es usar el agente. Idealmente, esta sería una opción de configuración en el complemento Maven Jetty, pero que yo sepa, todavía no tiene la capacidad de engendrar una nueva JVM para el servidor Jetty, lo cual es desafortunado. Por lo tanto, dado que Jetty se ejecuta en la misma JVM que Maven, debe especificar el agente allí. Usted dice que ya lo hizo, pero debe estar perdiendo algo. He publicado un executable example on github. Puede echar un vistazo al código fuente o un clon y ejecutar el ejemplo con:

git clone git://github.com/zzantozz/testbed.git tmp 
export MAVEN_OPTS=-javaagent:org.springframework.instrument-3.0.5.RELEASE.jar 
cd tmp/spring-aspectj-load-time-weaving-in-jetty 
mvn jetty:run 

A continuación, visita http://localhost:8080/spring-aspectj-load-time-weaving-in-jetty/ para ver que funcione. Por cierto, esto no está realmente relacionado con los servicios ReST, y solo está relacionado de manera incidental con Spring.

4

El jetty-maven-plugin ahora es compatible con el objetivo de ejecución-bifurcación, donde puede pasar argumentos de JVM. Mucho más fácil que Tomcat con carga o MAVEN_OPTS.

Cuestiones relacionadas