Получение Ожидание кадра карты стека в целевой ветке при запуске интеграционного тестирования Maven

Я использую Maven 3.2.3 с этой версией Java.

davea$ echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home

Когда я бегу

mvn clean install

Я получаю ошибки, подобные приведенным ниже, в моих интеграционных тестах…

testFindSampleUsersByCodeAscByDefault(org.mainco.subco.user.service.SampleUserService2IT)  Time elapsed: 2.204 sec  <<< ERROR!
java.lang.VerifyError: Expecting a stackmap frame at branch target 57
Exception Details:
  Location:
    org/mainco/subco/user/service/SampleUserServiceImpl$ValueComparator.compare(Lorg/mainco/subco/user/domain/User;Lorg/mainco/subco/user/domain/User;)I @10: ifnull
  Reason:
    Expected stackmap frame at this location.
  Bytecode:
    0x0000000: 2ab4 001b 2bb9 002e 0200 c600 2f2a b400
    0x0000010: 1b2b b900 2e02 00c0 0030 b600 34c6 001c
    0x0000020: 2ab4 001b 2bb9 002e 0200 c000 30b6 0034
    0x0000030: b600 39b6 003e a700 0512 404e 2ab4 001b
    0x0000040: 2cb9 002e 0200 c600 2f2a b400 1b2c b900
    0x0000050: 2e02 00c0 0030 b600 34c6 001c 2ab4 001b
    0x0000060: 2cb9 002e 0200 c000 30b6 0034 b600 39b6
    0x0000070: 003e a700 0512 403a 042d 1904 b600 4436
    0x0000080: 0515 0599 0016 2d19 04b6 0044 2d19 04b6
    0x0000090: 0044 b800 4a6c a700 0403 3606 1506 2ab4
    0x00000a0: 0023 9900 0702 a700 0404 a000 0502 ac04
    0x00000b0: ac                                     

    at org.mainco.subco.user.service.SampleUserServiceImpl.findSampleUsers(SampleUserServiceImpl.java:439)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:91)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
    at com.sun.proxy.$Proxy98.findSampleUsers(Unknown Source)
    at org.mainco.subco.user.service.SampleUserService2IT.testFindSampleUsersByCodeAscByDefault(SampleUserService2IT.java:215)

Вот как настроен мой плагин компилятора…

            <profile>
                    <id>jdk-8</id>
                    <activation>
                            <jdk>1.8</jdk>
                    </activation>
                    <build>
                            <plugins>
                                    <plugin>
                                            <groupId>org.apache.maven.plugins</groupId>
                                            <artifactId>maven-compiler-plugin</artifactId>
                                            <version>3.1</version>
                                            <configuration>
                                                    <source>1.8</source>
                                                    <target>1.8</target>
                                                    <compilerArgument>-proc:none</compilerArgument>
                                                    <fork>true</fork>
                                            </configuration>
                                            <executions>
                                                    <execution>
                                                            <id>default-testCompile</id>
                                                            <phase>test-compile</phase>
                                                            <goals>
                                                                    <goal>testCompile</goal>
                                                            </goals>
                                                    </execution>
                                            </executions>
                                    </plugin>
                            </plugins>
                    </build>
            </profile>

и вот как настроен мой отказоустойчивый

                    <plugin>
                            <groupId>org.apache.maven.plugins</groupId>
                            <artifactId>maven-failsafe-plugin</artifactId>
                            <version>2.18.1</version>
                            <configuration>
                                    <reuseForks>true</reuseForks>
                                    <argLine>-Xmx4096m -XX:MaxPermSize=512M -XX:-UseSplitVerifier ${itCoverageAgent}</argLine>
                                    <skipTests>${skipAllTests}</skipTests>
                            </configuration>
                            <executions>
                                    <execution>
                                            <goals>
                                                    <goal>integration-test</goal>
                                                    <goal>verify</goal>
                                            </goals>
                                    </execution>
                            </executions>
                    </plugin>

Есть идеи, как предотвратить эти странные ошибки «Ожидание кадра карты стека в целевой ветви», которые я вижу?

Изменить:

Я использую эти зависимости (как предполагают комментарии, что это были проблемы):

[INFO] +- org.springframework:spring-aop:jar:3.2.11.RELEASE:compile
...
[INFO] +- org.aspectj:aspectjweaver:jar:1.8.6:compile
[INFO] +- org.aspectj:aspectjrt:jar:1.8.6:compile

person Dave    schedule 22.07.2015    source источник
comment
Maven не имеет ничего общего с вашей проблемой. В вашей среде есть инструмент обработки байт-кода, который несовместим с последними функциями байт-кода, тогда как «недавний» означает «несколько лет назад», но до Java 8 параметр -XX:-UseSplitVerifier, который вы используете, помогал игнорировать эти проблемы. Первыми подозреваемыми являются структура АОП и агент покрытия. Первая попытка должна состоять в том, чтобы обновить все.   -  person Holger    schedule 22.07.2015
comment
Я удалил параметр ${itCoverageAGent} (ничего не менял) и использую Spring AOP 3.2.11.RELEASE и aspectj-weaver 1.8.6 (последняя версия). Обновление Spring AOP невозможно. Вы говорите, что эта версия Spring AOP несовместима с Java 8?   -  person Dave    schedule 22.07.2015
comment
Я не знаю этих библиотек в деталях. Все, что я сказал, было то, что один из них должен быть причиной. Быстрый поиск показал stackoverflow.com/a/27556298/2711488; может это поможет.   -  person Holger    schedule 22.07.2015
comment
Мне трудно поверить, что причина в этом. Когда я запускаю отдельный тестовый файл, например mvn clean test -Dtest=UserServiceIT, все проходит без ошибок. Только при запуске mvn clean install, когда все тесты запускаются вместе, я вижу всплывающие окна VerifyErrors.   -  person Dave    schedule 22.07.2015
comment
Что ж, для того, чтобы его воспроизвести, код должен содержать методы, которые пытается инструментировать АОП, и StackMapFrame, которые этот процесс может уничтожить. Для этого требуется достаточно сложный код, например. код без ветвей не имеет атрибута StackMapTable, поэтому нет фреймов для мусора. Но если в вашей среде есть другая библиотека, управляющая байт-кодом, которую вы подозреваете, вы можете проверить это. Я не претендовал на то, чтобы точно знать, кто виноват, я лишь рассказываю, о чем эта ошибка…   -  person Holger    schedule 22.07.2015
comment
где вы установили -noverify? Я установил его как MAVEN_OPTS, но у меня это не работает.   -  person dev    schedule 26.07.2017
comment
Отвечает ли это на ваш вопрос? java.lang.VerifyError: Ожидание кадра карты стека в целевой ветви JDK 1.7   -  person Vadzim    schedule 28.04.2020


Ответы (2)


У меня была такая же проблема, когда я перешел на JDK 8. Код создан нормально, просто получил эти ошибки при запуске модульных тестов. Я вижу, вы используете -XX:-UseSplitVerifier, который мне тоже не помог. Я где-то нашел короткую рекламу, что вместо использования -XX:-UseSplitVerifier с JDK 8 я должен использовать -noverify. Я попробовал, и это сработало для меня.

Надеюсь это поможет.

person Daniel Israel    schedule 14.10.2015
comment
где вы установили -noverify? Я установил его как MAVEN_OPTS, но у меня это не работает. - person dev; 26.07.2017

до java8 вы можете добавить элемент arg -XX:-UseSplitVerifier при запуске jvm для решения такой проблемы;

Элемент UseSplitVerifier arg был удален java8, но вы также можете использовать -noverify для замены

person mosec    schedule 22.06.2018