2

マスターpomと、マスターpomを参照するプロジェクト(およびpom.xmlファイル)をそれぞれ含む多数のサブディレクトリを持つマルチモジュールMavenプロジェクトがあります。

projectA には exec-maven-plugin の呼び出しが含まれています。これは Java ゴールを実行し、projectA のどこかに存在するテスト クラス (projectA/test/com/mycompany/Testclass.java) を正常に呼び出します。プラグインは次のように宣言されています: org.codehaus.mojo exec-maven-plugin 1.2.1

                <execution>
                    <id>execute-test</id>
                    <phase>pre-integration-test</phase>
                    <goals>
                        <goal>java</goal>
                    </goals>
                    <configuration>
                        <mainClass>com.mycompany.Testclass</mainClass>
                        <classpathScope>test</classpathScope>
                    </configuration>
                </execution>
            </executions>
        </plugin>

次のコマンドで maven を実行すると、正常に動作します。 mvn verify -P <profile name> -pl projectA -am

projectA に依存する 2 番目のプロジェクト projectB があります。上記と同じ、projectB の pom.xml ファイルに exec-maven-plugin セクションを構成しました。上記と同じコマンドで maven を実行すると (-pl パラメータの projectB を除く)、例外が発生しますjava.lang.ClassNotFoundException: com.mycompany.Testclass

これは、pom.xml が projectA に依存しているにもかかわらず、projectB の maven を実行したときのクラスパスに projectA のディレクトリが含まれていないためです (実際には projectA.1 に依存し、これは projectA に依存します)。

projectB で Java ゴールではなく exec ゴールを使用するように切り替えてから、次のように引数にクラスパスを指定しようとしました。

                <execution>
                    <id>execute-test</id>
                    <phase>pre-integration-test</phase>
                    <goals>
                        <goal>exec</goal>
                    </goals>
                    <configuration>
                        <executable>java</executable>
                        <arguments>
                            <argument>-classpath</argument>
                            <argument>"../projectA/target/projectA-6.6.1-bSOURCE-tests.jar;../projectA/target/projectA-6.6.1-bSOURCE.jar"</argument>
                            <argument>com.mycompany.Testclass</argument>
                        </arguments>
                        <classpathScope>test</classpathScope>
                    </configuration>
                </execution>

それが完了したら、クラスを正常にロードしましたが、com.google.gson.JsonSyntaxException で ClassNotFoundException を取得しました

次のように、コマンドラインからクラスを実行した場合に発生するのと同じエラーになります。

java -classpath "projectA/target/projectA-6.6.1-bSOURCE-tests.jar;projectA/target/projectA-6.6.1-bSOURCE.jar" com.mycompany.Testclass

projectB では、exec ゴールではなく exec-maven-plugin の Java ゴールを使用したいと思いますが、何らかの方法でクラスパスを指定できるようにする必要があります。

どのように私はそれを行うことができますか?

ありがとう。

4

1 に答える 1

0

私はこれを自分で理解し、他の誰かがそれを必要とする場合、または誰かがそれに異議を唱えたい(または何か良いことを提案したい)場合に備えて、私の答えを投稿しています。

私がしたことは、次のように下位プロジェクト projectB に依存関係を追加することでした。

    <dependency>
        <groupId>com.mycompany</groupId>
        <artifactId>projectA</artifactId>
        <version>6.6-SNAPSHOT</version>
        <scope>test</scope>
        <classifier>tests</classifier>
    </dependency>

クリンチャーは、projectA のテスト クラスを含む jar ファイルから依存クラスを取得するように Maven に指示する要素だったと思います。

于 2014-04-18T19:33:33.483 に答える