我想用HTTP请求测试我们的REST服务(有点黑盒测试)。然而,经过几个小时的谷歌搜索和尝试不同的配置,我仍然无法正确启动Jetty。这是我当前的配置(我尝试了多个不同的版本):
的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" />
现在,我得到了例外:
我理解异常,但我无法修复它。我还尝试了其他几种方法,比如通过MAVEN_OPTS提供javaagent或尝试将VM args设置为Jetty。问题是谷歌为不同的版本提供了一堆“解决方案”,但没有一个正在发挥作用。
我目前非常沮丧的是,在Spring中很难实现像REST服务测试这样的常见场景。所以,如果你足够聪明地找到正确的配置,请与我分享,即使是猴子也可以配置它,我保证如果我们遇见了啤酒,我就会这样做。
以下是我使用的版本:
<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
如果需要,我很乐意提供更多信息。就像我说的每一个帮助都赞赏。
答案 0 :(得分:4)
jetty-maven-plugin现在支持run-forked目标,您可以在其中传递JVM参数。比货物或MAVEN_OPTS的tomcat容易得多。
答案 1 :(得分:3)
这与ReST服务并不真正相关,而且它只与Spring有关。您的问题以AspectJ为中心,并在JVM中启用加载时编织。你说你明白这个例外,但我不确定你这么做。您是否阅读过Spring参考中的Load-time weaving with AspectJ部分?特别注意environment-specific configuration。问题是Jetty的ClassLoader实现不支持类转换,我不知道有任何替代方法,因此唯一的选择是使用代理。理想情况下,这将是Maven Jetty插件的配置选项,但据我所知,它仍然无法为Jetty服务器生成新的JVM,这是不幸的。因此,由于Jetty与Maven在同一个JVM中运行,因此您必须在那里指定代理。你说你已经做到了,但你必须遗漏一些东西。我发布了executable example on github。您可以查看源代码或克隆并运行以下示例:
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
然后访问http://localhost:8080/spring-aspectj-load-time-weaving-in-jetty/以查看是否有效。顺便说一下,这与ReST服务并不真正相关,而且只是偶然与Spring有关。
答案 2 :(得分:0)
我对Jetty也有问题。
如果你像我一样使用Tomcat而没有问题进行开发,我建议你坚持使用tomcat自动测试它们。
在不同教程上使用Jetty的示例很有效,因为他们的示例应用程序。是简单的(你好世界jsp ......)。
对于现实世界的应用,码头的配置更加复杂,使用它的好处也随之消失。
Jetty需要其他配置而不是Tomcat配置 因此,维持这一点是痛苦的,我发现他们的文档很差,没有任何价值。
我现在正在使用带货物的本地tomcat:启动它们启动它们,停止tomcat。 你不需要学习jetty东西只是重用你的实际tomcat配置 唯一的要求是在你的机器上安装了tomcat,并指向一个环境变量。
您甚至可以跳过它并在第一次使用货物配置时自动下载。