5

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" />

現在、例外が発生しています:

  • java.lang.IllegalStateException: ClassLoader [org.mortbay.jetty.webapp.WebAppClassLoader] は「addTransformer(ClassFileTransformer)」メソッドを提供しません。カスタム LoadTimeWeaver を指定するか、Spring のエージェントで Java 仮想マシンを起動します: -javaagent:org.springframework.instrument.jar

例外は理解できましたが、修正できませんでした。また、MAVEN_OPTS を介して javaagent を指定したり、VM 引数を Jetty に設定したりするなど、他のいくつかのアプローチも試しました。問題は、Google がさまざまなバージョンに対して一連の「解決策」を提供し、どれも機能していなかったことです。

私は現在、REST サービス テストを実行するような一般的なシナリオを Spring で実現するのが非常に難しいことにかなり不満を感じています。したがって、適切な構成を見つけるのに十分なほど賢い場合は、サルでも構成できる方法でそれを共有してください。

私が使用するバージョンは次のとおりです。

<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

必要に応じて、より多くの情報を喜んで提供します。私が言ったように、すべての助けに感謝します。

4

3 に答える 3

4

jetty-maven-plugin は、JVM 引数を渡すことができる run-forked ゴールをサポートするようになりました。cargo や MAVEN_OPTS を使った tomcat よりずっと簡単です。

于 2012-10-24T18:13:54.817 に答える
3

これは実際には ReST サービスとは関係がなく、偶然に Spring に関連しているだけです。あなたの問題は、AspectJ を中心としており、JVM でロード時の織り込みを有効にしています。あなたは例外を理解していると言いますが、私はあなたが理解しているかどうか確信が持てません。Spring リファレンスのAspectJ を使用したロード時の織り込みに関するセクションを読みましたか? 環境固有の構成に特に注意してください. 問題は、Jetty の ClassLoader 実装がクラス変換をサポートしていないことです。私はクラス変換をサポートする代替手段を認識していないため、残されている唯一のオプションはエージェントを使用することです。理想的には、これは Maven Jetty プラグインの構成オプションですが、残念なことに、私の知る限り、Jetty サーバー用の新しい JVM を生成する機能がまだありません。したがって、Jetty は Maven と同じ JVM で実行されているため、そこでエージェントを指定する必要があります。あなたはすでにそれをやったと言いますが、何かが欠けているに違いありません. 実行例を 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との関係は偶発的です。

于 2011-09-18T15:07:18.170 に答える
0

Jetty にも問題があります。

私のように、開発に問題なく Tomcat を使用している場合は、Tomcat を使用して自動テストを行うことをお勧めします。
さまざまなチュートリアルで Jetty を使用する例は、サンプル アプリが優れているため、うまく機能します。シンプルです(hello world jsp ...)。

実際のアプリケーションでは、jetty の構成はより複雑であり、それを使用するメリットはなくなります。

Jetty には、Tomcat を使用する場合とは別の構成が必要です。
したがって、これを維持するのは面倒であり、ドキュメントが貧弱であることに価値はありません。

私は現在、ローカルの tomcat を cargo で使用しています: 開始してそれらを起動し、Tomcat を停止します。実際のTomcat構成を再利用するだけで、桟橋について学ぶ必要はありません。
唯一の前提条件は、マシンに tomcat が既にインストールされていて、それを指す環境変数があることです。

それをスキップして、貨物構成で初めて自動的にダウンロードすることもできます。

于 2011-09-18T11:40:07.003 に答える