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

标签 java maven exec-maven-plugin

我有一个多模块 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 <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目标,但无论怎样我都必须能够指定类路径。

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

谢谢。

最佳答案

我自己解决了这个问题,并发布我的答案,以防其他人需要它,或者如果有人想对此提出异议(或提出更好的建议)。

我所做的是在从属项目projectB中添加依赖项,如下所示:

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

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

关于java - 在多模块 Maven 项目中运行 exec-maven-plugin 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23143952/

相关文章:

java - 如何让 Eclipse 正确地与 Maven 和 SVN 一起工作?

java - maven-exec-plugin 无缘无故抛出异常

java - 通过蓝牙将字符串从作为客户端的 PC 发送到作为服务器的移动设备

java - 如何使用 Swing 创建布局?

java - 将jar名称设置为包名称开头是否正常

java - 类未找到异常 : CompositeUriComponentsContributor when running in Jetty

java - 是否有 HTML5 输入电子邮件验证的 Java 实现?

java - java中的复合类型

java - 将 line.separator 传递给 Maven

java - 使用 Maven 从已部署的 Artifact 运行主类