在Maven中创建可执行测试jar时出错

时间:2011-11-29 20:16:27

标签: unit-testing maven jar testng executable-jar

我正在尝试创建一个可以放在非开发机器上的JAR,并运行一些运行Web服务的单元测试。我已经读过在maven中有很多方法可以做到这一点。我专注于使用测试jar目标,因为这似乎是最合乎逻辑的方法。

我的测试是在一个单独的maven项目中,文件夹结构为:

/myProject/src/test/java/org/testplatform/services/test/<name of testng test>.java

这是我在pom中测试jar的配置:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <executions>
              <execution>
                <goals>
                  <goal>test-jar</goal>
                </goals>
              </execution>
            </executions>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <mainClass>org/testplatform/services/test/MainTestClass.java</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>

当我执行生成的JAR时,我收到此错误:

Exception in thread "main" java.lang.NoClassDefFoundError: org/testng/ITestListener
Caused by: java.lang.ClassNotFoundException: org.testng.ITestListener
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)

有人可以帮助我理解我需要在我的pom和/或测试中做出哪些更改来创建一个独立的,可执行的JAR来运行testng单元测试吗?一个演示项目会有所帮助。

1 个答案:

答案 0 :(得分:1)

错误表明您正在使用TestNG类,并且这些类在结果类路径中不可用。这是可能的,因为您test确定了testNG依赖关系

<dependency>
  <groupId>...</groupId>
  <artifactId>...</artifactId>
  <version>...</version>
  <scope>test</scope>           <<< Test scope
</dependency>

这将导致从生成的JAR中排除此依赖项。

如果您还没有,我建议您阅读Maven's in-depth explanation建议测试JAR的建议方法以及要避免的陷阱。

您已经完成了将测试类提取到单独项目的正确步骤。这可以确保您可以利用Maven的传递依赖性。您还需要将依赖项移出测试范围。