无法在多模块Maven项目中运行exec-maven-plugin

时间:2014-04-17 21:41:48

标签: java maven exec-maven-plugin

我有一个带有主pom的多模块Maven项目和许多子目录,每个子目录包含引用主pom的项目(和pom.xml文件)。

在projectA中包含exec-maven-plugin的调用,它执行java目标并成功调用位于projectA中某个地方的测试类(在projectA / test / com / mycompany / Testclass.java中)。该插件声明如下:                              org.codehaus.mojo                 EXEC - Maven的插件                 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

我有第二个项目projectB,它取决于projectA。我在projectB的pom.xml文件中配置了一个与上面相同的exec-maven-plugin部分。当我使用与上面相同的命令运行maven时(除了在-pl参数中使用projectB),我得到异常java.lang.ClassNotFoundException: com.mycompany.Testclass

显然这种情况正在发生,因为我为projectB运行maven时的类路径不包含projectA中的目录,即使pom.xml依赖于projectA(实际上它依赖于projectA.1,而projectA.1依赖于projectA) )。

我尝试在projectB中切换到使用exec目标而不是java目标,然后在参数中提供类路径,如下所示:

                <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-maven-plugin的java目标而不是exec目标,但是我必须能够指定类路径。

我有什么想法可以做到这一点?

感谢。

1 个答案:

答案 0 :(得分:0)

我自己想出来了,如果有人需要,或者有人想提出异议(或提出更好的建议),我会发布我的回答。

我所做的是在下级项目projectB中添加一个依赖项,如下所示:

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

我相信紧要关系是元素,它指示maven从包含projectA中测试类的jar文件中获取依赖类。