【问题标题】:Maven run class before test phase: exec-maven-plugin exec:java not executing class测试阶段之前的 Maven 运行类:exec-maven-plugin exec:java 未执行类
【发布时间】:2018-03-22 19:39:27
【问题描述】:

我正在 Jenkins 机器上运行使用 Maven 构建的 jUnit4 测试。我的目标是在执行测试之前恢复测试数据库。

看起来 exec-maven-plugin 是可行的方法,但我无法让它运行。任何指针?虽然有很多例子,但 mojo 网站上的文档很薄。

我需要运行的课程目前位于:

MyProject.src.test.java._tools.BuildTestEnvironment.java

我的 pom.xml 包括:

<pluginManagement>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>
        <plugin>            
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.3</version>
            <executions>
                <execution>
                    <id>build-test-environment</id>
                    <phase>generate-test-resources</phase>            
                    <goals>
                        <goal>java</goal>            
                    </goals>
                </execution>
            </executions>
            <configuration>
                <mainClass>src.test.java._tools.BuildTestEnvironment</mainClass>
            </configuration>
        </plugin>
    </plugins>
</pluginManagement>

在 Jenkins 中运行它,什么都没有发生。如果我在本地运行它,我会得到 ​​p>

我尝试过的事情,但没有成功:

  1. 在 Jenkins 中运行构建:什么都没有发生。项目构建并开始运行测试,但我的课程没有运行。

  2. 在本地运行构建:与 Jenkins 中的结果相同。这并不奇怪。

  3. 在本地运行 generate-test-resources:ClassNotFoundException。即:

    mvn exec:java 生成测试资源
    java.lang.ClassNotFoundException: src.test.java._tools.BuildTestEnvironment

  4. 将类编译到 jar 中,并将其添加到我的 pom 中。

更新:

在阅读了@ppuskar 的 cmets 之后,我尝试移动我的 buildxxx 类。将其移至 src.main.java._tools.BuildTestEnvironment 后,我​​仍然收到类似的消息。这是我的构建日志,以防万一:

[调试] 调用:test.java._tools.BuildTestEnvironment.main()
[DEBUG] 插件依赖项将被排除。
[DEBUG] 将包含项目依赖项。
[DEBUG] 收集的项目工件 [joda-time:joda-time:jar:2.3:compile, net.sf.jt400:jt400:jar:6.7:compile, junit:junit:jar:4.11:compile, org.hamcrest:hamcrest -core:jar:1.3:compile, com.fasterxml.jackson.core:jackson-core:jar:2.3.0:compile, com.fasterxml.jackson.core:jackson-databind:jar:2.3.0:compile, com .fasterxml.jackson.core:jackson-annotations:jar:2.3.0:compile, org.hamcrest:hamcrest-all:jar:1.3:compile, org.apache.logging.log4j:log4j-api:jar:2.0-rc1 :compile, org.apache.logging.log4j:log4j-core:jar:2.0-rc1:compile]
[调试] 收集的项目类路径 [C:\workspace\VSP_UnitTest\target\classes]
[调试] 添加到类路径:file:/C:/workspace/VSP_UnitTest/target/classes/
[调试] 添加项目依赖工件:joda-time 到类路径
[调试] 添加项目依赖工件:jt400 到类路径
[调试] 添加项目依赖工件:junit 到类路径
[DEBUG] 添加项目依赖工件:hamcrest-core 到类路径
[调试] 添加项目依赖工件:jackson-core 到类路径
[调试] 添加项目依赖工件:jackson-databind 到类路径
[DEBUG] 添加项目依赖工件:jackson-annotations 到类路径
[调试] 添加项目依赖工件:hamcrest-all 到类路径
[调试] 添加项目依赖工件:log4j-api 到类路径
[调试] 添加项目依赖工件:log4j-core 到类路径
[DEBUG] 加入线程 Thread[test.java._tools.BuildTestEnvironment.main(),5,test.java._tools.BuildTestEnvironment]
[警告] java.lang.ClassNotFoundException: test.java._tools.BuildTestEnvironment
在 java.net.URLClassLoader$1.run(URLClassLoader.java:366)
在 java.net.URLClassLoader$1.run(URLClassLoader.java:355)
在 java.security.AccessController.doPrivileged(Native Method)
在 java.net.URLClassLoader.findClass(URLClassLoader.java:354)
在 java.lang.ClassLoader.loadClass(ClassLoader.java:424)
在 java.lang.ClassLoader.loadClass(ClassLoader.java:357)
在 org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:281)
在 java.lang.Thread.run(Thread.java:724)
[信息] --------------------------------------------- -------------------------
[信息] 构建失败
[信息] --------------------------------------------- -------------------------
[INFO] 总时间:2.602 秒
[INFO] 完成于:2014-05-15T14:38:50-05:00
[INFO] 最终内存:12M/152M
[信息] --------------------------------------------- -------------------------

【问题讨论】:

  • 如果使用 jenkins,请确保 POM 和类更改已提交到存储库,并检查 jenkins 是否正在从源代码存储库获取更新的源代码。

标签: java maven jenkins exec-maven-plugin


【解决方案1】:

我想将此作为评论留下来解决 Rebzie 的评论,但我没有声誉。

但是你的主配置中有测试配置

Exec Maven 插件支持更改类路径范围,这样您就可以使用测试范围的资源,而无需将它们移出测试包,如下所示:

<configuration>
    <mainClass>src.test.java._tools.BuildTestEnvironment</mainClass>
    <classpathScope>test</classpathScope>
</configuration>

这提供了一个干净的解决方案,您的测试设置代码保留在您的测试资源中。

【讨论】:

    【解决方案2】:

    尝试将 BuildTestEnvironment.javasrc.test.java._tools 移动到 src.main.java._tools 即你的班级将是src.main.java._tools.BuildTestEnvironment

    我尝试运行您提供的场景。它像你说的那样失败了,但是我将 java 文件从 test 移到 main ......它 RAN :)

    干杯:)

    【讨论】:

    • 但是你的主配置中有测试配置
    • 我明白你在说什么,@LouisaBuchanan。就我而言,整个项目都是测试(即,没有可部署的代码),我们将非测试助手(主要用于测试值的数据获取器)保留在“main”中。所以将构建脚本移到那里很好。
    【解决方案3】:

    我正在尝试一些非常相似的东西,如果有人偶然发现,我就把我的发现留在这里。我打算在测试中创建一个类来创建一些测试资源,然后运行实际测试。

    核心问题是maven阶段test-compilegenerate-test-resources之后运行。执行时test分支中的代码还没有编译,因此exec-plugin没有找到编译的类。

    我的临时解决方案是将执行插件附加到阶段process-test-classes

    【讨论】:

      猜你喜欢
      • 2023-01-24
      • 1970-01-01
      • 2012-03-03
      • 2017-05-06
      • 2012-04-08
      • 2018-07-09
      • 2012-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多