Scala Merkwürdige exceptions bei for-loops nach der compilation mit maven

0x7F800000

Top Contributor
Hallo Allerseits

Ich verstehe gar nicht, was hier abgeht: plötzlich werden nicht mal mehr einfachste for-loops bei scala ausgeführt, folgender code:
Java:
package org.wtfifwithforloop

object App {
  
  def main(args : Array[String]) {
    for ( i <- 1 to 10){
	  println(i)
	}
  }

}
führt zu sowas:

Code:
C:\Users\Andrey\Desktop\maven projects\forLoopWtf>scala -cp target\classes org.wtfifwithforloop.App
java.lang.ClassCastException: scala.collection.immutable.Range$Inclusive cannot be cast to scala.collection.immutable.Range$ByOne
        at org.wtfifwithforloop.App$.main(App.scala:6)
        at org.wtfifwithforloop.App.main(App.scala)
        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 scala.tools.nsc.util.ScalaClassLoader$$anonfun$run$1.apply(ScalaClassLoader.scala:78)
        at scala.tools.nsc.util.ScalaClassLoader$class.asContext(ScalaClassLoader.scala:24)
        at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.asContext(ScalaClassLoader.scala:88)
        at scala.tools.nsc.util.ScalaClassLoader$class.run(ScalaClassLoader.scala:78)
        at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.run(ScalaClassLoader.scala:101)
        at scala.tools.nsc.ObjectRunner$.run(ObjectRunner.scala:33)
        at scala.tools.nsc.ObjectRunner$.runAndCatch(ObjectRunner.scala:40)
        at scala.tools.nsc.MainGenericRunner.runTarget$1(MainGenericRunner.scala:56)
        at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:80)
        at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:89)
        at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)

so hab ich das projekt zusammengebaut:
Code:
C:\Users\Andrey\Desktop\maven projects>mvn archetype:generate
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:2.0:generate (default-cli) @ standalone-pom >>>
[INFO]
[INFO] <<< maven-archetype-plugin:2.0:generate (default-cli) @ standalone-pom <<<
[INFO]
[INFO] --- maven-archetype-plugin:2.0:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Interactive mode
[INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.0)
Choose archetype:
1: remote -> docbkx-quickstart-archetype (-)
2: remote -> multi (-)
3: remote -> simple (-)
4: remote -> springmvc-archetype (-)
5: remote -> apparat-archetype-asm (-)
6: remote -> apparat-archetype-tdsi (-)
7: remote -> gquery-archetype (-)
[...]
433: remote -> cfg-module (-)
434: remote -> liftweb-archetype-blank (Archetype - blank project for liwftweb)
435: remote -> liftweb-archetype-hellolift (Archetype - hellolift sample liwftweb application)
436: remote -> scala-archetype-simple (The maven-scala-plugin is used for compiling/testing/running/documenting scala code in maven.)
437: remote -> slf4j-archetype (The slf4j Archetype)
438: remote -> flexmojos-archetypes-application (-)
[...]
451: remote -> circumflex-archetype (-)
452: remote -> javg-minimal-archetype (-)
Choose a number: 131: 436
Choose version:
1: 1.0
2: 1.1
3: 1.2
4: 1.3
Choose a number: 4:
Define value for property 'groupId': : org.wtfifwithforloop
Define value for property 'artifactId': : forLoopWtf
Define value for property 'version':  1.0-SNAPSHOT: :
Define value for property 'package':  org.wtfifwithforloop: :
Confirm properties configuration:
groupId: org.wtfifwithforloop
artifactId: forLoopWtf
version: 1.0-SNAPSHOT
package: org.wtfifwithforloop
 Y: : y
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1:08.871s
[INFO] Finished at: Mon Sep 19 00:11:42 CEST 2011
[INFO] Final Memory: 8M/21M
[INFO] ------------------------------------------------------------------------
C:\Users\Andrey\Desktop\maven projects>cd forLoopWtf

C:\Users\Andrey\Desktop\maven projects\forLoopWtf>mvn compile
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building forLoopWtf 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.4.3:resources (default-resources) @ forLoopWtf ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory C:\Users\Andrey\Desktop\maven projects\forLoopWtf\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ forLoopWtf ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-scala-plugin:2.15.0:compile (default) @ forLoopWtf ---
[INFO] Checking for multiple versions of scala
[INFO] includes = [**/*.scala,**/*.java,]
[INFO] excludes = []
[INFO] C:\Users\Andrey\Desktop\maven projects\forLoopWtf\src\main\scala:-1: info: compiling
[INFO] Compiling 1 source files to C:\Users\Andrey\Desktop\maven projects\forLoopWtf\target\classes at 1316383970864
[INFO] No known dependencies. Compiling everything
[INFO] prepare-compile in 0 s
[INFO] compile in 4 s
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.870s
[INFO] Finished at: Mon Sep 19 00:12:55 CEST 2011
[INFO] Final Memory: 5M/15M
[INFO] ------------------------------------------------------------------------

C:\Users\Andrey\Desktop\maven projects\forLoopWtf>scala -cp target\classes org.wtfifwithforloop.App
java.lang.ClassCastException: scala.collection.immutable.Range$Inclusive cannot be cast to scala.collection.immutable.Range$ByOne
        at org.wtfifwithforloop.App$.main(App.scala:6)
        at org.wtfifwithforloop.App.main(App.scala)
        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 scala.tools.nsc.util.ScalaClassLoader$$anonfun$run$1.apply(ScalaClassLoader.scala:78)
        at scala.tools.nsc.util.ScalaClassLoader$class.asContext(ScalaClassLoader.scala:24)
        at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.asContext(ScalaClassLoader.scala:88)
        at scala.tools.nsc.util.ScalaClassLoader$class.run(ScalaClassLoader.scala:78)
        at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.run(ScalaClassLoader.scala:101)
        at scala.tools.nsc.ObjectRunner$.run(ObjectRunner.scala:33)
        at scala.tools.nsc.ObjectRunner$.runAndCatch(ObjectRunner.scala:40)
        at scala.tools.nsc.MainGenericRunner.runTarget$1(MainGenericRunner.scala:56)
        at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:80)
        at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:89)
        at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)

so sieht die pom.xml aus (hab an der nix gemacht):
[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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.wtfifwithforloop</groupId>
<artifactId>forLoopWtf</artifactId>
<version>1.0-SNAPSHOT</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>

[/xml]

Wenn man analoge triviale Beispiele per hand mit scalac kompiliert, dann passiert nichts außergewöhnliches, alles läuft wie immer... An der Scala-Version oder maven oder JRE habe ich die letzten paar tage nichts geändert, nur neues projekt mit maven erzeugt , und jetzt läuft nix mehr...

Hat das einer schon gesehen? Vorschläge? :autsch: Wäre sehr dankbar für jede Hypothese.
 
Zuletzt bearbeitet von einem Moderator:

0x7F800000

Top Contributor
hast recht, hast recht...
Code:
C:\Users\Andrey\Desktop\maven projects>java -version
java version "1.7.0"
Java(TM) SE Runtime Environment (build 1.7.0-b147)
Java HotSpot(TM) Client VM (build 21.0-b17, mixed mode, sharing)

C:\Users\Andrey\Desktop\maven projects>scala -version
Scala code runner version 2.9.0.1 -- Copyright 2002-2011, LAMP/EPFL

C:\Users\Andrey\Desktop\maven projects>scala -Jversion
Welcome to Scala version 2.9.0.1 (Java HotSpot(TM) Client VM, Java 1.7.0).

C:\Users\Andrey\Desktop\maven projects>mvn -version
Apache Maven 3.0.3 (r1075438; 2011-02-28 18:31:09+0100)
Maven home: C:\Program Files\Maven303\apache-maven-3.0.3
Java version: 1.7.0, vendor: Oracle Corporation
Java home: C:\Program Files\Java\jdk1.7.0\jre
Default locale: de_DE, platform encoding: Cp1252
OS name: "windows 7", version: "6.1", arch: "x86", family: "windows"
Alles hat aber mit denselben programmen noch vor drei Tagen funktioniert, deswegen sollte es imho irgendwie an maven-einstellungen liegen, und an dem, was er sich neulich aus seinen repositories gezogen hat... Ehrlich gesagt verstehe ich nicht so wirklich, was genau maven alles runterlädt: was bedeutet beispielsweise scala-version 2.8 statt 2.9 in der pom? Das bedeutet, dass maven sich automatisch den älteren scala-compiler runterlädt, den irgendwo ungefähr unter
Code:
MeinbenutzerName\.m2\repositories\org\scala-lang\compiler\2.8
deponiert, und dann beim kompilen verwendet, dabei ist die Version des scalac-Compilers im PATH völlig egal? Korrekt so ungefähr? Dann verstehe ich aber nach wie vor nicht, warum scala-version 2.8 mit einer for-schleife nicht klarkommt :autsch: Oder passiert es deswegen, weil ich einen unter 2.8 kompilierten Code mit scala 2.9 aufrufe? Daran müsste es liegen... :bahnhof:
 
Zuletzt bearbeitet:

0x7F800000

Top Contributor
Ok, danke maki, es geht wieder:

Code:
<scala-version>2.9</scala-version>
in der pom geändert, und es funktioniert wieder... Habe gestern abend irgendwie überblick verloren, und hier irgendeinen blödsinn gepostet, war eigentlich völlig banal: man kann keinen unter 2.8 kompilierten code unter 2.9 ausführen, nicht mal for-schleifen, weil es zwischendrin massive eingriffe in die collections gegeben hat, zu den Ranges ebenfalls gehören, die implizit in den scheinbar simpelsten for-loops auftauchen.
 
A

AwsmDude

Gast
Warum implizit bei den einfachsten for-Schleifen?
Die Methode to von RichInt gibt ein Inclusive zurück und Inclusive erbt von Range:
RichInt

Aber ja, es ist richtig, dass 2.8 und 2.9 nicht kompatibel zueinander sind.
 

0x7F800000

Top Contributor
Warum implizit bei den einfachsten for-Schleifen
Ja, eben darum: diese "for-schleifen" sind ja keine eingebauten konstrukte, und sind eigentlich auch keine schleifen, sondern aufrufe von foreach an irgendwelchen Range-Objekten, die nach dem impliziten cast von Int nach RichInt mit Hilfe von to instantiiert werden... Oder auch nicht instanziiert werden: die leute haben da schon so viele optimierungen in den compiler eingebaut, dass er richtig große brocken code einfach wegwirft und durch etwas viel einfacheres ersetzt, und ich will deswegen gar nicht wissen, was letztendlich aus dieser schleife wird, und was dieses ByOne ist: geht mich nichts an :)
 
A

AwsmDude

Gast
Ach, so meintest du das. Alles klar. :)
ByOne ist ein Trait das im Object Range enthalten ist. Das ist mittlerweile deprecated. for expression haben das Trait vorher wohl öfter mal verwendet oder wie auch immer.
Bei Scala muss man bissl aufpassen mit der Version. :) Am 2.8 Zweig wird ja auch noch weiterentwickelt.
 
A

AwsmDude

Gast
Vielleicht war "weiterentwickelt" das falsche Wort dafür. Also sorry für die Verwirrung.
Sind maintenance Releases. Erst vor kurzem (heute?) kam die RC3 von der 2.8.2 Version raus.
Dies wurde unter anderem gemacht, um mit 2.8 besser zur neuen Eclipse Scala IDE Version kompatibel zu sein. Die anderen Änderungen sind kleinere fixes. Also neues kommt da dann nicht dazu.
 

Neue Themen


Oben