2012-10-10 30 views
7

he creado un nuevo proyecto Scala con lo siguiente:Iniciación a la Scala, Scalatest, y Maven

mvn org.apache.maven.plugins:maven-archetype-plugin:2.2:generate 
    -DarchetypeGroupId=org.scala-tools.archetypes 
    -DarchetypeArtifactId=scala-archetype-simple 
    -DarchetypeVersion=1.3 
    -DgroupId=myGroup 
    -DartifactId=myProject 
    -Dversion=0.1.0 
    -DinteractiveMode=false 

Lo que me da el siguiente POM:

<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/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>myGroup</groupId> 
    <artifactId>myProject</artifactId> 
    <version>0.1.0</version> 
    <name>${project.artifactId}</name> 
    <description>My wonderfull scala app</description> 
    <inceptionYear>2010</inceptionYear> 
    <licenses> 
    <license> 
     <name>My License</name> 
     <url>http://....</url> 
     <distribution>repo</distribution> 
    </license> 
    </licenses> 

    <properties> 
    <maven.compiler.source>1.5</maven.compiler.source> 
    <maven.compiler.target>1.5</maven.compiler.target> 
    <encoding>UTF-8</encoding> 
    <scala.version>2.8.0</scala.version> 
    </properties> 

<!-- 
    <repositories> 
    <repository> 
     <id>scala-tools.org</id> 
     <name>Scala-Tools Maven2 Repository</name> 
     <url>http://scala-tools.org/repo-releases</url> 
    </repository> 
    </repositories> 

    <pluginRepositories> 
    <pluginRepository> 
     <id>scala-tools.org</id> 
     <name>Scala-Tools Maven2 Repository</name> 
     <url>http://scala-tools.org/repo-releases</url> 
    </pluginRepository> 
    </pluginRepositories> 
--> 
    <dependencies> 
    <dependency> 
     <groupId>org.scala-lang</groupId> 
     <artifactId>scala-library</artifactId> 
     <version>${scala.version}</version> 
    </dependency> 

    <!-- Test --> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.8.1</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.scala-tools.testing</groupId> 
     <artifactId>specs_${scala.version}</artifactId> 
     <version>1.6.5</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.scalatest</groupId> 
     <artifactId>scalatest</artifactId> 
     <version>1.2</version> 
     <scope>test</scope> 
    </dependency> 
    </dependencies> 

    <build> 
    <sourceDirectory>src/main/scala</sourceDirectory> 
    <testSourceDirectory>src/test/scala</testSourceDirectory> 
    <plugins> 
     <plugin> 
     <groupId>org.scala-tools</groupId> 
     <artifactId>maven-scala-plugin</artifactId> 
     <version>2.15.0</version> 
     <executions> 
      <execution> 
      <goals> 
       <goal>compile</goal> 
       <goal>testCompile</goal> 
      </goals> 
      <configuration> 
       <args> 
       <arg>-make:transitive</arg> 
       <arg>-dependencyfile</arg> 
       <arg>${project.build.directory}/.scala_dependencies</arg> 
       </args> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <version>2.6</version> 
     <configuration> 
      <useFile>false</useFile> 
      <disableXmlReport>true</disableXmlReport> 
      <!-- If you have classpath issue like NoDefClassError,... --> 
      <!-- useManifestOnlyJar>false</useManifestOnlyJar --> 
      <includes> 
      <include>**/*Test.*</include> 
      <include>**/*Suite.*</include> 
      </includes> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 
</project> 

puedo correr mvn test y la muestra las pruebas se ejecutan con éxito. Me gustaría utilizar la versión más reciente de scala (descargué/instalé 2.9.2 ...), pero el most recent version of the org.scala-tools.testing scala_VERSION dependency seems to be 2.9.1. Me hizo los siguientes cambios en mi POM:

<scala.version>2.9.1</scala.version> 

y

<dependency> 
     <groupId>org.scala-tools.testing</groupId> 
     <artifactId>specs_${scala.version}</artifactId> 
     <version>1.6.5</version> 
     <scope>test</scope> 
    </dependency> 

Ahora, corriendo mvn test da

------------------------------------------------------- 
    T E S T S 
------------------------------------------------------- 
Running samples.ListSuite 
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.674 sec <<< FAILURE! 
initializationError(samples.ListSuite) Time elapsed: 0.003 sec <<< ERROR! 
java.lang.ClassCastException: scala.collection.immutable.Set$EmptySet$ cannot be 
    cast to scala.collection.generic.Addable 
     at org.scalatest.FunSuite$class.test(FunSuite.scala:1039) 
     at samples.ListSuite.test(scalatest.scala:59) 
     at samples.ListSuite.<init>(scalatest.scala:61) 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 

     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
     at java.lang.reflect.Constructor.newInstance(Constructor.java:525) 
     at java.lang.Class.newInstance0(Class.java:372) 
     at java.lang.Class.newInstance(Class.java:325) 
     at org.scalatest.junit.JUnitRunner.<init>(JUnitRunner.scala:62) 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 

     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
     at java.lang.reflect.Constructor.newInstance(Constructor.java:525) 
     at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31) 
     at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) 
     at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) 
     at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) 
     at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) 
     at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24) 
     at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:51) 
     at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:120) 
     at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:103) 
     at org.apache.maven.surefire.Surefire.run(Surefire.java:169) 
     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.SurefireBooter.runSuitesInProcess(SurefireBooter.java:350) 
     at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1021) 

Running samples.StackSuite 
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.12 sec 
Running samples.AppTest 
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec 

Results : 

Tests in error: 
    initializationError(samples.ListSuite) 

Tests run: 4, Failures: 0, Errors: 1, Skipped: 0 

[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD FAILURE 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 6.880s 
[INFO] Finished at: Wed Oct 10 01:10:56 ADT 2012 
[INFO] Final Memory: 9M/112M 
[INFO] ------------------------------------------------------------------------ 
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.6:test (default-test) on project myProject: There are test failures. 
[ERROR] 
[ERROR] Please refer to C:\Dropbox\work\dev\scalasandbox\target\surefire-reports for the individual test results. 
[ERROR] -> [Help 1] 
[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/MojoFailureException 

que presumiblemente tienen algunas de las más simples posibles pruebas (muestras creadas por el plugin maven archetype), y toparse con scala por una sola versión menor los está rompiendo? ¿Debo seguir con Scala 2.8 hasta que las herramientas Maven se pongan al día?

+1

que estaba limpia antes de ejecutar las pruebas? Parece una incompatibilidad binaria. –

+0

Sí; 'mvn clean' no ayudó. – MrDrews

Respuesta

13

Tu artefacto está desactualizado.

La última versión de Scala es 2.10. Actualmente ScalaTest se distribuye bajo groupid diferente y es compatible con la última versión de Scala. Aquí está la dependecy:

<dependency> 
    <groupId>org.scalatest</groupId> 
    <artifactId>scalatest_2.10</artifactId> 
    <version>2.0.M5b</version> 
    <scope>test</scope> 
</dependency> 

También requerirá un plugin diferente:

<plugin> 
    <groupId>net.alchim31.maven</groupId> 
    <artifactId>scala-maven-plugin</artifactId> 
    <version>3.1.0</version> 
    <executions> 
     <execution> 
     <phase>compile</phase> 
     <goals> 
      <goal>compile</goal> 
      <goal>testCompile</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin> 

No es necesario especificar los repositorios, ya que todos estos artefactos están siendo distribuidos con el repositorio central.

Here's an example of a complete pom of a project depending on the Scala 2.10.

+0

Las pruebas generadas por maven-archetype-plugin no 'mvn-compgin' con 2.10.0-M7. Supongo que la respuesta es "No use maven-archetype-plugin". Scala (tools/libs) parece tener una falta general de compatibilidad con versiones anteriores, lo cual me parece desalentador. – MrDrews

+0

Derecha. Nadie usa el arquetipo. Francamente, encuentro que la generación de arquetipos es una característica redundante y confusa de Maven. –

+0

He clonado tu proyecto sorm, pero no compila (me falta tu dependencia de texto). Creo que me quedaré con 2.8 por ahora. Estoy trabajando en el libro Programming in Scala, que fue escrito para 2.8, de todos modos. – MrDrews

Cuestiones relacionadas