2012-06-03 15 views
6

Obtuve una clase simple con test case y todo funciona bien en eclipse, pero cuando ejecuto maven build (con estos objetivos: install cobertura: cobertura checkstyle: checkstyle-aggregate) I ' Estoy viendo un error de verificación en el informe de seguridad.Maven build causa VerifyError con java 1.7

Aquí es el error exacto:

------------------------------------------------------------------------------- 
Test set: com.diploma.testProject.ClassUnderTestTest 
------------------------------------------------------------------------------- 
Tests run: 2, Failures: 0, Errors: 2, Skipped: 0, Time elapsed: 0.034 sec <<< FAILURE! 
testMethodReturnsTrue(com.diploma.testProject.ClassUnderTestTest) Time elapsed: 0.005 sec <<< ERROR! 
java.lang.VerifyError: Expecting a stackmap frame at branch target 79 in method com.diploma.testProject.ClassUnderTest.method(II)Z at offset 24 
    at com.diploma.testProject.ClassUnderTestTest.testMethodReturnsTrue(ClassUnderTestTest.java:37) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 
    at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:35) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:146) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:97) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.apache.maven.surefire.booter.ProviderFactory$ClassLoaderProxy.invoke(ProviderFactory.java:103) 
    at $Proxy0.invoke(Unknown Source) 
    at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:145) 
    at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcess(SurefireStarter.java:87) 
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:69) 

testMethodReturnFalse(com.diploma.testProject.ClassUnderTestTest) Time elapsed: 0 sec <<< ERROR! 
java.lang.VerifyError: Expecting a stackmap frame at branch target 79 in method com.diploma.testProject.ClassUnderTest.method(II)Z at offset 24 
    at com.diploma.testProject.ClassUnderTestTest.testMethodReturnFalse(ClassUnderTestTest.java:42) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 
    at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:35) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:146) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:97) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.apache.maven.surefire.booter.ProviderFactory$ClassLoaderProxy.invoke(ProviderFactory.java:103) 
    at $Proxy0.invoke(Unknown Source) 
    at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:145) 
    at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcess(SurefireStarter.java:87) 
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:69) 

Ésta es la clase:

public class ClassUnderTest { 
    public static boolean method(int a, int b) { 
     if (a == b) { 
      System.out.println(""); 
      return true; 
     } 
     return false; 
    } 
} 

Y la prueba:

public class ClassUnderTestTest { 

    @Test 
    public void testMethodReturnsTrue() { 
     assertTrue(ClassUnderTest.method(1, 1)); 
    } 

    @Test 
    public void testMethodReturnFalse() throws Exception { 
     assertFalse(ClassUnderTest.method(1, 2)); 
    } 

} 

Y pom.xml:

<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"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.diploma</groupId> 
    <artifactId>testProject</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>jar</packaging> 

    <name>testProject</name> 
    <url>http://maven.apache.org</url> 

    <properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 

    <dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.10</version> 
     <scope>test</scope> 
    </dependency> 
    </dependencies> 

    <build> 
    <pluginManagement> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>2.4</version> 
       <configuration> 
        <source>1.7</source> 
        <target>1.7</target> 
        <testSource>1.7</testSource> 
        <testTarget>1.7</testTarget> 
       </configuration> 
      </plugin> 
     </plugins> 
    </pluginManagement> 
    </build> 
</project> 

Cuando establezco el objetivo en 1.5 esto funciona, pero necesito que funcione con 1.7. Más extraño es que al modificar el método para tener sólo un retorno de la siguiente manera:

public class ClassUnderTest { 
    public static boolean method(int a, int b) { 
     if (a == b) { 
      System.out.println(""); 
     } 
     return false; 
    } 
} 

soluciona también el problema. He intentado configurar el objetivo y la versión de origen en el bloque de propiedades de pom, pero el resultado fue el mismo.

¿Hay alguna manera de que esto funcione en la versión 1.7?

EDITAR: También este problema aparece solo con goal coverage: cobertura.

+0

Esto parece ser un problema común, con preguntas muy similares publicados en SO. Publiqué la resolución a nuestro problema se resolvió con esto: http://stackoverflow.com/a/20001391/1279002 – theINtoy

Respuesta

20

El problema parece estar en la Cobertura. Parece que no es compatible con Java 1.7 muy bueno. La solución era similar al enlace que @Raghuram escribió para el eclipse. pom Modificación como esto hace que la prueba funciona bien:

<build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-surefire-plugin</artifactId> 
       <version>2.12</version> 
       <configuration> 
        <argLine>-XX:-UseSplitVerifier</argLine> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>2.4</version> 
       <configuration> 
        <source>1.7</source> 
        <target>1.7</target> 
        <testSource>1.7</testSource> 
        <testTarget>1.7</testTarget> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
+0

Una configuración similar funciona con buildr: ENV ['JAVA_OPTS'] || = "-XX: UseSplitVerifier" – Dzhaughn

4

Editar: mvn cobertura:cobertura no funciona debido a la falta de compatibilidad de cobertura para Java 7. This SO question habla de esto. Parece que JaCoCo es el camino a seguir.

mvn install funciona bien para mí desde la línea de comandos con maven-3.0.4 y java 1.7.0_04 en Windows 7. Es posible que usted está golpeando this eclipse bug?

Para agregar a la respuesta de @Pau ', <pluginManagement> se utiliza en poms de varios módulos para declarar <plugin> elementos que se pueden heredar según lo requerido por los niños.

me sale ningún error con el pom en la pregunta, así el siguiente fragmento:

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>2.4</version> 
      <configuration> 
       <source>1.7</source> 
       <target>1.7</target> 
       <testSource>1.7</testSource> 
       <testTarget>1.7</testTarget> 
      </configuration> 
     </plugin> 
    </plugins> 

+0

Hm .. Recibí el mismo error desde la línea de comandos también, pero ahora descubrí que es de la cobertura objetivo : cobertura. Cuando se ejecuta solo, la instalación funciona bien. Gracias por la nota sobre

+0

@ZhivkoDelchev. Me sale el mismo error con 'cobertura'. Se actualizó la respuesta – Raghuram

+0

Cobertura 2.x es nuevo, admite java 7. – Dzhaughn

Cuestiones relacionadas