6

我需要使用surefire v2.12,但每次运行该版本时都会得到附加的堆栈跟踪。如果我运行 v2.10,我不会收到错误消息。我需要这个版本,所以我可以用@Category 注释我的测试类并将它们标记为UnitTests 或IntegrationTests。这是我的命令: mvn test -Dsurefire.version=2.12 -X

    [错误] 无法执行目标 org.apache.maven.plugins:maven-surefire-plugin:2.12:test (default-test) on project PROJECT: Execution default-test of goal org.apache.maven.plugins:maven-surefire -插件:2.12:测试失败:java.lang.reflect.InvocationTargetException;嵌套异常是 java.lang.reflect.InvocationTargetException: null: ExceptionInInitializerError: Unexpected ClassNotFoundException 查找类 'org.apache.maven.cli.MavenCli' -> [帮助 1]
org.apache.maven.lifecycle.LifecycleExecutionException:无法在项目 ASPEN 上执行目标 org.apache.maven.plugins:maven-surefire-plugin:2.12:test (default-test):执行目标 org.apache 的默认测试。 maven.plugins:maven-surefire-plugin:2.12:test failed: java.lang.reflect.InvocationTargetException; 嵌套异常是 java.lang.reflect.InvocationTargetException: null
    在 org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:225)
    在 org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
    在 org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
    在 org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84)
    在 org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59)
    在 org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183)
    在 org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161)
    在 org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:320)
    在 org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156)
    在 org.apache.maven.cli.MavenCli.execute(MavenCli.java:537)
    在 org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196)
    在 org.apache.maven.cli.MavenCli.main(MavenCli.java:141)
    在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    在 java.lang.reflect.Method.invoke(Method.java:597)
    在 org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290)
    在 org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230)
    在 org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409)
    在 org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352)
    引起:org.apache.maven.plugin.PluginExecutionException:执行目标org.apache.maven.plugins的默认测试:maven-surefire-plugin:2.12:测试失败:java.lang.reflect.InvocationTargetException;嵌套异常是 java.lang.reflect.InvocationTargetException: null
    在 org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:110)
    在 org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209)
    ... 19 更多
    引起:org.apache.maven.surefire.util.SurefireReflectionException: java.lang.reflect.InvocationTargetException; 嵌套异常是 java.lang.reflect.InvocationTargetException: null
    在 org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:197)
    在 org.apache.maven.surefire.util.ReflectionUtils.invokeGetter(ReflectionUtils.java:69)
    在 org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.getSuites(ProviderFactory.java:148)
    在 org.apache.maven.plugin.surefire.booterclient.ForkStarter.getSuitesIterator(ForkStarter.java:317)
    在 org.apache.maven.plugin.surefire.booterclient.ForkStarter.runSuitesForkPerTestSet(ForkStarter.java:149)
    在 org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:118)
    在 org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeProvider(AbstractSurefireMojo.java:199)
    在 org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAllProviders(AbstractSurefireMojo.java:176)
    在 org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked(AbstractSurefireMojo.java:135)
    在 org.apache.maven.plugin.surefire.AbstractSurefireMojo.execute(AbstractSurefireMojo.java:98)
    在 org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101)
    ... 20 更多
    引起:java.lang.reflect.InvocationTargetException
    在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    在 java.lang.reflect.Method.invoke(Method.java:597)
    在 org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
    ... 30 更多
    引起:java.lang.ExceptionInInitializerError
    ... 2 更多
    在 java.lang.Class.forName0(本机方法)
    在 java.lang.Class.forName(Class.java:169)
    在 org.junit.runner.Description.getTestClass(Description.java:207)
    在 org.apache.maven.surefire.common.junit48.FilterFactory$GroupMatcherCategoryFilter.shouldRun(FilterFactory.java:207)
    在 org.apache.maven.surefire.junitcore.JUnitCoreProvider.getSuitesAsList(JUnitCoreProvider.java:169)
    在 org.apache.maven.surefire.junitcore.JUnitCoreProvider.getSuites(JUnitCoreProvider.java:102)
    ... 35 更多
    引起:java.lang.RuntimeException:Unexpected ClassNotFoundException 查找类 'org.apache.maven.cli.MavenCli'
    ... 12 更多

    (此处已删除行)

我的 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
    <artifactId>sample</artifactId>
    <groupId>sample</groupId>
    <version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>webapp</artifactId>
<packaging>war</packaging>
<dependencies>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${org.slf4j-version}</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>${org.slf4j-version}</version>
    </dependency>
    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-all</artifactId>
        <version>1.9.0</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.10</version>
    </dependency>
</dependencies>
<reporting>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>findbugs-maven-plugin</artifactId>
            <version>2.5.1</version>
        </plugin>
    </plugins>
</reporting>
<build>
    <plugins>
        <plugin>
            <artifactId>maven-surefire-plugin</artifactId>
            <dependencies>
                <dependency>
                    <groupId>org.apache.maven.surefire</groupId>
                    <artifactId>surefire-junit47</artifactId>
                    <version>${surefire.version}</version>
                    <scope>test</scope>
                </dependency>
            </dependencies>
            <configuration>
                <groups>com.webapp.api.annotation.type.${group.include}</groups>
                <excludedGroups>com.webapp.api.annotation.type.${group.exclude}</excludedGroups>
            </configuration>
        </plugin>
    </plugins>
</build>
</project>

此外,我能够在我从废品中建立的另一个项目中做到这一点。但在这种情况下,如您所见,我正在覆盖 surefire 插件版本。

有任何想法吗?

谢谢

4

1 回答 1

1

为什么不把版本放到这个 pom 中,因为这个 pom 是由你控制的,任何使用你的项目的人都会惊讶于它不起作用,因为他错过了在命令行上提供属性。顺便说一句:您是否通过 mvn -X -Dsurefire.version=2.12 等检查了输出。我认为您会收到相同的错误消息。

我已经重新检查过,如果您以这种方式定义版本,如果有人错过命令行上的选项(-D ...),您的项目将不再正确,您将得到如下信息:

INFO] Scanning for projects...
[ERROR] The build could not read 1 project -> [Help 1]
[ERROR]   
[ERROR]   The project com.soebes.katas:code:1.0-SNAPSHOT (/home/katas/pom.xml) has 1 error
[ERROR]     'build.plugins.plugin.version' for org.apache.maven.plugins:maven-surefire-plugin must be a valid version but is '${surefire.version}'. @ line 36, column 20
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/ProjectBuildingException

换句话说,通过命令行上的选项来定义插件版本(或它的依赖项)是一个非常糟糕的主意。我只是建议您在 pom 中定义您需要的所有版本,并通过 surefire 和/或故障安全插件正确使用单元测试和集成测试。这将解决您的问题。

于 2012-07-07T16:19:20.813 回答