在多模块 Maven 项目中运行 exec-maven-plugin 时出现问题

Posted

技术标签:

【中文标题】在多模块 Maven 项目中运行 exec-maven-plugin 时出现问题【英文标题】:Trouble running exec-maven-plugin in a multi-module Maven project 【发布时间】:2014-06-02 08:42:43 【问题描述】:

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

在 projectA 中包含对 exec-maven-plugin 的调用,它执行 java 目标并成功调用驻留在 projectA 中某处(在 projectA/test/com/mycompany/Testclass.java 中)的测试类。插件声明如下: org.codehaus.mojo 执行 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 &lt;profile name&gt; -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】:

这是我自己想出来的,我会发布我的答案以防其他人需要它,或者如果有人想对此提出异议(或提出更好的建议)。

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

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

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

【讨论】:

以上是关于在多模块 Maven 项目中运行 exec-maven-plugin 时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

maven ::在多模块项目中仅运行单个测试

在多模块 Maven 项目中更新模块的版本号

使用 Spring 在多模块 Maven 项目中进行集成测试

在多模块 maven 项目中的模块之间共享 src/test 类

如何在多模块 Maven 项目中自动重用依赖版本?

在多模块 Java/scala 项目中有一个通用的 webapp?