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>