Cobertura: Ошибка чтения файла. Cobertura.ser: null java.io.EOFException: null

Я работал над Cobertura в течение нескольких месяцев, и недавно я получаю сообщение об ошибке "Ошибка чтения.ser файла" из определенного целевого местоположения. У кого-нибудь есть идея, почему я получаю следующую ошибку:

Плагин Cobertura Maven версия:2.7

Версия Java: 1.8

    [INFO] Cobertura 2.1.1 - GNU GPL License (NO WARRANTY) - See COPYRIGHT file
[ERROR] Cobertura: Error reading file C:\view\
xyz\target\cobertura\cobertura.s
er: null
java.io.EOFException: null
        at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputSt
ream.java:2626) ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1321) ~[
na:1.8.0_102]
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:20
18) ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1942)
 ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1
808) ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353) ~[
na:1.8.0_102]
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373) ~[na
:1.8.0_102]
        at java.util.HashMap.readObject(HashMap.java:1404) ~[na:1.8.0_102]
        at sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source) ~[na:na]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:43) ~[na:1.8.0_102]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_102]
        at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:105
8) ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1909)
 ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1
808) ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353) ~[
na:1.8.0_102]
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:20
18) ~[na:1.8.0_102]
        at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:50
3) ~[na:1.8.0_102]
        at net.sourceforge.cobertura.coveragedata.CoverageDataContainer.readObje
ct(CoverageDataContainer.java:321) ~[cobertura-2.1.1.jar:2.1.1]
        at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source) ~[na:na]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:43) ~[na:1.8.0_102]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_102]
        at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:105
8) ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1909)
 ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1
808) ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353) ~[
na:1.8.0_102]
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373) ~[na
:1.8.0_102]
        at java.util.HashMap.readObject(HashMap.java:1404) ~[na:1.8.0_102]
        at sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source) ~[na:na]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:43) ~[na:1.8.0_102]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_102]
        at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:105
8) ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1909)
 ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1
808) ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353) ~[
na:1.8.0_102]
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:20
18) ~[na:1.8.0_102]
        at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:50
3) ~[na:1.8.0_102]
        at net.sourceforge.cobertura.coveragedata.CoverageDataContainer.readObje
ct(CoverageDataContainer.java:321) ~[cobertura-2.1.1.jar:2.1.1]
        at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source) ~[na:na]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:43) ~[na:1.8.0_102]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_102]
        at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:105
8) ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1909)
 ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1
808) ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353) ~[
na:1.8.0_102]
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373) ~[na
:1.8.0_102]
        at java.util.HashMap.readObject(HashMap.java:1404) ~[na:1.8.0_102]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.
0_102]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:62) ~[na:1.8.0_102]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:43) ~[na:1.8.0_102]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_102]
        at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:105
8) ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1909)
 ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1
808) ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353) ~[
na:1.8.0_102]
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:20
18) ~[na:1.8.0_102]
        at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:50
3) ~[na:1.8.0_102]
        at net.sourceforge.cobertura.coveragedata.CoverageDataContainer.readObje
ct(CoverageDataContainer.java:321) ~[cobertura-2.1.1.jar:2.1.1]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.
0_102]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:62) ~[na:1.8.0_102]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:43) ~[na:1.8.0_102]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_102]
        at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:105
8) ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1909)
 ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1
808) ~[na:1.8.0_102]
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353) ~[
na:1.8.0_102]
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373) ~[na
:1.8.0_102]
        at net.sourceforge.cobertura.coveragedata.CoverageDataFileHandler.loadCo
verageData(CoverageDataFileHandler.java:85) ~[cobertura-2.1.1.jar:2.1.1]
        at net.sourceforge.cobertura.coveragedata.CoverageDataFileHandler.loadCo
verageData(CoverageDataFileHandler.java:62) ~[cobertura-2.1.1.jar:2.1.1]
        at net.sourceforge.cobertura.dsl.Cobertura.getProjectDataInstance(Cobert
ura.java:146) [cobertura-2.1.1.jar:2.1.1]
        at net.sourceforge.cobertura.dsl.Cobertura.report(Cobertura.java:122) [c
obertura-2.1.1.jar:2.1.1]
        at net.sourceforge.cobertura.reporting.ReportMain.parseArgumentsAndRepor
t(ReportMain.java:91) [cobertura-2.1.1.jar:2.1.1]
        at net.sourceforge.cobertura.reporting.ReportMain.generateReport(ReportM
ain.java:141) [cobertura-2.1.1.jar:2.1.1]
        at net.sourceforge.cobertura.reporting.ReportMain.main(ReportMain.java:1
51) [cobertura-2.1.1.jar:2.1.1]
Report time: 1031ms

Заранее спасибо.

2 ответа

Попытка обновления памяти, как указано выше, и это не сработало для нас. Тем не менее, найдено "решение" (или, по крайней мере, исправить) случайно другим способом:

У нас было около 60 тестовых классов, которые были украшены аннотацией уровня класса

@RunWith(PowerMockRunner.class)

По совпадению, поскольку эти классы не показывали покрытие в наших локальных средах (которые фактически используют EclEmma для покрытия кода - что аналогично JaCoCo - ИЗВЕСТНАЯ ПРОБЛЕМА), я попытался преобразовать аннотацию...

@RunWith(PowerMockRunner.class)

в

@RunWith(MockitoJUnitRunner.class)

и смог преобразовать около 30 из 60, которые у нас были. Пока мы не смогли преобразовать их все, так как некоторые из них связаны с функциями PowerMock в тестах, такими как тестирование статических методов. Но преобразование аннотации из PowerMockRunner в MockitoJUnitRunner все же каким-то образом исправило вышеуказанную проблему ошибки Cobertura в соответствии с вышеуказанной ошибкой. Я до сих пор не могу дать содержательный ответ относительно того, почему это именно так, потому что Cobertura показывает покрытие для классов с @RunWith(PowerMockRunner.class). Но я обновлю этот пост, как только узнаю.

Обычно файлы.ser блокируются, только когда у вас недостаточно памяти, выделенной для cobertura для создания отчета. Решение должно быть

1) Удалите все ненужные файлы тестовых классов из src/test/java и запустите cobertura или

2) Увеличьте объем памяти cobertura, что-то вроде ниже

    <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>cobertura-maven-plugin</artifactId>
            <version>2.7</version>
            <configuration>
                <quiet>true</quiet>
                <cobertura.maxmem>1024m</cobertura.maxmem>
                <instrumentation>
                    <excludes>
                        <exclude>com/homepage/helper/ABC.class</exclude>

                    </excludes>
                    <ignores>
                        <!-- <ignore>com..homepage..helper.ABC</ignore> -->
                    </ignores>
                    <maxmem>1024m</maxmem>
                </instrumentation>
                <argLine>-Xms512m -Xmx2048m -XX:MaxPermSize=1024m</argLine>
                <!-- <argLine>-Xmx2048m</argLine> -->
            </configuration>
            <executions>
                <execution>
                    <id>clean</id>
                    <phase>pre-site</phase>
                    <goals>
                        <goal>clean</goal>
                    </goals>
                </execution>
                <execution>
                    <id>instrument</id>
                    <phase>site</phase>
                    <goals>
                        <goal>instrument</goal>
                        <goal>cobertura</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

В pom.xml просто измените размер cobertura.maxmem на любой другой, и у нас есть возможность игнорировать несколько классов при создании отчета.

3) И еще одна возможность, что ваша верная версия плагина не поддерживается. Если два вышеуказанных решения не работают, попробуйте обновить верную версию, как показано ниже (maven-surefire-plugin должен быть 2.12):

<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.12</version>
            <dependencies>
                <dependency>
                    <groupId>org.apache.maven.surefire</groupId>
                    <artifactId>surefire-junit47</artifactId>
                    <version>2.17</version>
                </dependency>
            </dependencies>             
            <configuration>                     
                     <groups>${testcase.include}</groups>
                     <excludedGroups>${testcase.exclude}</excludedGroups>
            </configuration>

        </plugin>

Надеюсь, это полезно.

Убедитесь, что рядом с файлом есть файл cobertura.ser.lock. Если это так, то проблема в том, что cobertura записывает данные покрытия в конце цикла, когда виртуальная машина выключается. Исходя из того, сколько у вас было занятий, это может занять некоторое время. Плагин Surefire убивает виртуальную машину, если она не закрывается в течение 30 секунд по умолчанию, иногда в середине процесса, оставляя файл заблокированным. Вы можете решить эту проблему, используя surefire 2.20 или выше и добавив большее значение времени ожидания отключения (forkedProcessExitTimeoutInSeconds). Вот пример:

 <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.20</version>
    <configuration>
         <forkedProcessExitTimeoutInSeconds>120</forkedProcessExitTimeoutInSeconds>
    </configuration>
 </plugin>
Другие вопросы по тегам