2012-10-10 17 views
7

Ho creato un nuovo progetto di scala con il seguente:Introduzione a Scala, ScalaTest, e 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 

Il che mi dà il seguente 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> 

posso correre mvn test e il campione test eseguiti con successo. Mi piacerebbe usare la versione più recente di scala (ho scaricato/installato 2.9.2 ...), ma lo most recent version of the org.scala-tools.testing scala_VERSION dependency seems to be 2.9.1. Ho fatto i seguenti cambiamenti nella mia POM:

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

e

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

Ora, in esecuzione mvn test

------------------------------------------------------- 
    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 

ho presumibilmente avere alcuni dei più semplici test possibili (campioni creati da il plugin di archetipo di maven) e scalare scala con una singola versione minore li sta infrangendo? Dovrei limitarmi a utilizzare lo scala 2.8 fino a quando gli strumenti di prova non si aggiornano?

+1

si hanno pulito prima di eseguire i test? Sembra un'incompatibilità binaria. –

+0

Sì; 'mvn clean' non ha aiutato. – MrDrews

risposta

13

Il tuo artefatto non è aggiornato.

L'ultima versione di Scala è 2.10. Attualmente ScalaTest viene distribuito in diversi groupid e supporta l'ultima versione di Scala. Ecco il dependecy:

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

Si richiederà anche un plugin diverso:

<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> 

Non è necessario specificare alcun repository, dal momento che tutti i manufatti sono distribuiti con il repo centrale.

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

+0

I test generati dal plugin maven-archetype non eseguiranno 'mvn compile' con 2.10.0-M7. Immagino che la risposta sia "Non usare maven-archetype-plugin". Scala (tools/libs) sembra avere una generale mancanza di retrocompatibilità, che trovo scoraggiante. – MrDrews

+0

Giusto. Nessuno usa l'archetipo. Francamente trovo che la generazione di archetipi sia una caratteristica ridondante e confusa di Maven. –

+0

Ho clonato il tuo progetto sorm, ma non sarebbe stato compilato (mi manca la tua dipendenza da sext). Penso che resterò con 2.8 per ora - sto lavorando al libro Programming in Scala, che è stato scritto per 2.8, comunque. – MrDrews