Исключение с плагином surefire с фазой тестирования в maven

Мне нужно использовать surefire v2.12, но я получаю прикрепленную трассировку стека каждый раз, когда запускаю эту версию. Если я запускаю v2.10, я не получаю сообщение об ошибке. Мне нужна эта версия, чтобы я мог аннотировать свои тестовые классы с помощью @Category и помечать их как UnitTests или IntegrationTests. Вот моя команда: mvn test -Dsurefire.version = 2.12 -X

    [ERROR] Failed to execute goal 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-plugin:2.12:test failed: java.lang.reflect.InvocationTargetException; nested exception is java.lang.reflect.InvocationTargetException: null: ExceptionInInitializerError: Unexpected ClassNotFoundException looking up class 'org.apache.maven.cli.MavenCli' -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.12:test (default-test) on project ASPEN: Execution default-test of goal org.apache.maven.plugins:maven-surefire-plugin:2.12:test failed: java.lang.reflect.InvocationTargetException; nested exception is java.lang.reflect.InvocationTargetException: null
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:225)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:320)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156)
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:537)
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196)
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:141)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352)
    Caused by: org.apache.maven.plugin.PluginExecutionException: Execution default-test of goal org.apache.maven.plugins:maven-surefire-plugin:2.12:test failed: java.lang.reflect.InvocationTargetException; nested exception is java.lang.reflect.InvocationTargetException: null
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:110)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209)
    ... 19 more
    Caused by: org.apache.maven.surefire.util.SurefireReflectionException: java.lang.reflect.InvocationTargetException; nested exception is java.lang.reflect.InvocationTargetException: null
    at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:197)
    at org.apache.maven.surefire.util.ReflectionUtils.invokeGetter(ReflectionUtils.java:69)
    at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.getSuites(ProviderFactory.java:148)
    at org.apache.maven.plugin.surefire.booterclient.ForkStarter.getSuitesIterator(ForkStarter.java:317)
    at org.apache.maven.plugin.surefire.booterclient.ForkStarter.runSuitesForkPerTestSet(ForkStarter.java:149)
    at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:118)
    at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeProvider(AbstractSurefireMojo.java:199)
    at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAllProviders(AbstractSurefireMojo.java:176)
    at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked(AbstractSurefireMojo.java:135)
    at org.apache.maven.plugin.surefire.AbstractSurefireMojo.execute(AbstractSurefireMojo.java:98)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101)
    ... 20 more
    Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
    ... 30 more
    Caused by: java.lang.ExceptionInInitializerError
    ... 2 more
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:169)
    at org.junit.runner.Description.getTestClass(Description.java:207)
    at org.apache.maven.surefire.common.junit48.FilterFactory$GroupMatcherCategoryFilter.shouldRun(FilterFactory.java:207)
    at org.apache.maven.surefire.junitcore.JUnitCoreProvider.getSuitesAsList(JUnitCoreProvider.java:169)
    at org.apache.maven.surefire.junitcore.JUnitCoreProvider.getSuites(JUnitCoreProvider.java:102)
    ... 35 more
    Caused by: java.lang.RuntimeException: Unexpected ClassNotFoundException looking up class 'org.apache.maven.cli.MavenCli'
    ... 12 more

    (deleted lines here)

Мой 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>

Кроме того, я смог сделать это в другом проекте, который я создал из лома. Но в этом случае, как вы можете видеть, я перезаписываю верную версию плагина.

Любые идеи?

Спасибо


person bclarance    schedule 06.07.2012    source источник
comment
Какую версию maven вы используете?   -  person gkamal    schedule 07.07.2012
comment
Если у вас есть интеграционные тесты, maven-surefire-plugin - неправильный путь. Вместо этого для проверки интеграции используйте maven-failsafe-plugin.   -  person khmarbaise    schedule 07.07.2012
comment
@gkamal Я использую maven 3.0.4   -  person bclarance    schedule 07.07.2012
comment
@khmarbaise У меня есть как интеграционные, так и модульные тесты, и я хочу пометить оба. $ {Group.exclude} и $ {group.include} соответственно определяют, какие из двух ярлыков используются для каких. т.е. -Dgroup.include = UnitTest   -  person bclarance    schedule 07.07.2012
comment
Лучше всего разделить модульный тест и интеграционный тест, используя соглашения об именах (модульный тест: Test.java, Test .java, TestCase.java; интеграционные тесты: IT .java , * IT.java или * ITCase.java). Если вы используете плагины (надежные для модульных тестов и отказоустойчивые для интеграционных тестов) правильно, вам не нужно использовать такую ​​странную конструкцию через исключение групп и т. Д. Они разделены жизненным циклом.   -  person khmarbaise    schedule 07.07.2012
comment
Кроме того, размещенный помпон выглядит как отрывок из вашего помпона, не могли бы вы дать более подробную информацию?   -  person khmarbaise    schedule 07.07.2012
comment
@khmarbaise Да, я понимаю, что это была бы лучшая практика, и намерение, вероятно, состоит в том, чтобы запускать разные тесты в разных жизненных циклах, но я имею дело с тяжелым устаревшим кодом, где я не могу начать переименовывать тестовые классы. Любые идеи о том, как сделать эту работу, будут оценены?   -  person bclarance    schedule 07.07.2012
comment
Что касается пом. Да вы правы. Я не могу опубликовать остальную часть pom, но я скажу вам, что он наследуется от некоторых родительских poms, от которых один из них имеет junit 3.8.2 в качестве зависимости, и верную версию 2.10, из которой я переопределяю свойство, используя -Dsurefire.version = 2,12   -  person bclarance    schedule 07.07.2012


Ответы (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 и правильно использовать модульные и интеграционные тесты с помощью надежного и / или отказоустойчивого плагина. Это решит ваши проблемы.

person khmarbaise    schedule 07.07.2012
comment
Я не мог согласиться с этим, и этот родительский pom в конечном итоге будет обновлен. Моя проблема в том, что у родительского pom есть много других иждивенцев, поэтому мне нужно убедиться, что он работает, прежде чем я смогу применить это изменение / обновление навсегда. Да, я запускал его с параметром -X, но не вижу, как это мне помогает. Если знаете, на что обращать внимание, сообщите, пожалуйста. - person bclarance; 07.07.2012
comment
Просто введите номер версии в свой pom и протестируйте его таким образом. Кроме того, использование версий плагина и / или зависимостей в командной строке не работает. Чтобы изменить этот pom и протестировать его с указанными вами версиями, потребовалось бы 50 секунд. Вы можете прокомментировать в pom, почему вы решили использовать другую версию maven-surefire-pugin вместо унаследованной. - person khmarbaise; 07.07.2012
comment
Изменил проект pom с версией и все еще получаю исключение; mvn clean test -e -X. Вот некоторые результаты, подтверждающие, что изменение вступило в силу: [DEBUG] org.apache.maven.surefire: surefire-api: jar: 2.12: compile (выбранный для компиляции) какие-либо другие идеи? - person bclarance; 07.07.2012
comment
Можете ли вы опубликовать вывод на pastebin и т. Д. - person khmarbaise; 07.07.2012