sbtがinvokeDynamicに対応してなくて、"Unknown constant: 18" っていわれる

java8*1 をダウンロードして、sbt0.12.3で以下のようなjavaファイルコンパイルしたら、エラーになった*2


追記
sbt0.13系では、Scala2.10.xになったので、対応してる、はず


import java.util.function.*;

public class A{
  public static void main(String[] args){
    Function<Integer,Integer> b = a -> a + 1;
    System.out.println(b.apply(2));
  }
}

まだ全然対応してないみたい。Scala本体は最近2.11に向けてjava8対応を始めてるみたいだけど、sbtはいつになるんだろう・・・。java8試すのに、mavenとかIDE起動させてやるの面倒・・・。sbtでコンパイルできないということは、現状「java8 + Scala」な環境構築かなりしんどいし、「java8 + Scala」は、もう少し環境整備されるの待ったほうがよさそう・・・。



ここに

CONSTANT_MethodHandle	15
CONSTANT_MethodType	16
CONSTANT_InvokeDynamic	18

の定義がない
https://github.com/sbt/sbt/blob/v0.12.3/util/classfile/ClassFile.scala#L49-L65
http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.4

https://github.com/sbt/sbt/blob/v0.12.3/util/classfile/Parser.scala#L141-L151


以下stacktrace

java.lang.RuntimeException: Unknown constant: 18
	at scala.sys.package$.error(package.scala:27)
	at scala.Predef$.error(Predef.scala:123)
	at sbt.classfile.Parser$.getConstant(Parser.scala:150)
	at sbt.classfile.Parser$.parse$1(Parser.scala:127)
	at sbt.classfile.Parser$.sbt$classfile$Parser$$parseConstantPool(Parser.scala:132)
	at sbt.classfile.Parser$$anon$1.<init>(Parser.scala:32)
	at sbt.classfile.Parser$.parseImpl(Parser.scala:24)
	at sbt.classfile.Parser$.sbt$classfile$Parser$$parse(Parser.scala:20)
	at sbt.classfile.Parser$$anonfun$apply$1.apply(Parser.scala:19)
	at sbt.classfile.Parser$$anonfun$apply$1.apply(Parser.scala:19)
	at sbt.Using.apply(Using.scala:25)
	at sbt.classfile.Parser$.apply(Parser.scala:19)
	at sbt.classfile.Analyze$$anonfun$analyze$1$1.apply(Analyze.scala:39)
	at sbt.classfile.Analyze$$anonfun$analyze$1$1.apply(Analyze.scala:38)
	at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:233)
	at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:233)
	at scala.collection.immutable.Set$Set1.foreach(Set.scala:86)
	at scala.collection.TraversableLike$class.map(TraversableLike.scala:233)
	at scala.collection.immutable.Set$Set1.scala$collection$SetLike$$super$map(Set.scala:73)
	at scala.collection.SetLike$class.map(SetLike.scala:93)
	at scala.collection.immutable.Set$Set1.map(Set.scala:73)
	at sbt.classfile.Analyze$.analyze$1(Analyze.scala:38)
	at sbt.classfile.Analyze$.apply(Analyze.scala:86)
	at sbt.compiler.AggressiveCompile$$anonfun$4$$anonfun$compileJava$1$1.apply$mcV$sp(AggressiveCompile.scala:81)
	at sbt.compiler.AggressiveCompile$$anonfun$4$$anonfun$compileJava$1$1.apply(AggressiveCompile.scala:81)
	at sbt.compiler.AggressiveCompile$$anonfun$4$$anonfun$compileJava$1$1.apply(AggressiveCompile.scala:81)
	at sbt.compiler.AggressiveCompile.sbt$compiler$AggressiveCompile$$timed(AggressiveCompile.scala:101)
	at sbt.compiler.AggressiveCompile$$anonfun$4.compileJava$1(AggressiveCompile.scala:80)
	at sbt.compiler.AggressiveCompile$$anonfun$4.apply(AggressiveCompile.scala:88)
	at sbt.compiler.AggressiveCompile$$anonfun$4.apply(AggressiveCompile.scala:60)
	at sbt.inc.IncrementalCompile$$anonfun$doCompile$1.apply(Compile.scala:24)
	at sbt.inc.IncrementalCompile$$anonfun$doCompile$1.apply(Compile.scala:22)
	at sbt.inc.Incremental$.cycle(Incremental.scala:52)
	at sbt.inc.Incremental$.compile(Incremental.scala:29)
	at sbt.inc.IncrementalCompile$.apply(Compile.scala:20)
	at sbt.compiler.AggressiveCompile.compile2(AggressiveCompile.scala:96)
	at sbt.compiler.AggressiveCompile.compile1(AggressiveCompile.scala:44)
	at sbt.compiler.AggressiveCompile.apply(AggressiveCompile.scala:31)
	at sbt.Compiler$.apply(Compiler.scala:79)
	at sbt.Defaults$$anonfun$compileTask$1.apply(Defaults.scala:574)
	at sbt.Defaults$$anonfun$compileTask$1.apply(Defaults.scala:574)
	at sbt.Scoped$$anonfun$hf2$1.apply(Structure.scala:578)
	at sbt.Scoped$$anonfun$hf2$1.apply(Structure.scala:578)
	at scala.Function1$$anonfun$compose$1.apply(Function1.scala:49)
	at sbt.Scoped$Reduced$$anonfun$combine$1$$anonfun$apply$12.apply(Structure.scala:311)
	at sbt.Scoped$Reduced$$anonfun$combine$1$$anonfun$apply$12.apply(Structure.scala:311)
	at sbt.$tilde$greater$$anonfun$$u2219$1.apply(TypeFunctions.scala:41)
	at sbt.std.Transform$$anon$5.work(System.scala:71)
	at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:232)
	at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:232)
	at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:18)
	at sbt.Execute.work(Execute.scala:238)
	at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:232)
	at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:232)
	at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:160)
	at sbt.CompletionService$$anon$2.call(CompletionService.scala:30)
	at java.util.concurrent.FutureTask.run(FutureTask.java:262)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
	at java.util.concurrent.FutureTask.run(FutureTask.java:262)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:724)
[error] (compile:compile) Unknown constant: 18

*1: ここ から、 "8 Build b88" というversion

*2:もちろんjdk8で直接javacすればコンパイル、実行できるソース