我有一个混合的scala/java项目,并且有一个主机上有多个jdks。默认的java (通过alternatives)是jdk8。如果我构建一个指定了不同java-home的项目,java源代码仍然是使用路径上的缺省jdk构建的。
$ java -version
java version "1.8.0_20"根据主机的设置,/usr/bin/java链接到/etc/alternatives/java,后者链接到/usr/lib/jvm/jdk8/bin/java。
$ sbt -java-home /usr/lib/jvm/jdk7 compile
....
[warn] Error reading API from class file : java.lang.UnsupportedClassVersionError: my/org/package/SomeJavaClass : Unsupported major.minor version 52.0
....
$ javap -verbose target/scala_2.10/classes/my/org/package/SomeJavaClass.class | grep major
major version: 52
$ javap -verbose target/scala_2.10/classes/my/org/package/SomeScalaClass.class | grep major
major version: 51正如您所看到的,java源代码被编译到java8(假设从默认路径衍生出一个java进程),而scala源代码则使用jdk7进行构建。通过在构建定义中指定javacOptions,我可以为Java7编译java源代码:
javacOptions ++= Seq("-source","1.7","-target", "1.7")但我希望避免在构建源代码中这样做,如果可能的话,我更喜欢在编译时使用sbt参数为java7构建。
如何让SBT使用不同的java (假设fork一个java进程并指定完整路径)?如果SBT没有从java-home目录生成javac,这会被认为是sbt的bug吗?
发布于 2016-05-18 17:48:53
您可以在build.sbt或Build.scala中为Scala编译器设置目标JVM:
scalacOptions +=“-目标:jvm-1.7”
https://stackoverflow.com/questions/37295912
复制相似问题