我有一个混合的scala / java项目,并且有一个主机上有多个jdks。默认的java(通过替代品)是jdk8。如果我构建一个指定不同java-home的项目,那么仍然使用路径上的默认jdk构建java源代码。
$ 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源代码被编译为java 8(假设从默认路径生成java
进程),而scala源代码使用jdk7构建。我可以通过在构建定义中指定javacOptions来获取java源代码来编译java 7:
javacOptions ++= Seq("-source","1.7","-target", "1.7")
但我想避免在构建源中执行此操作,并且如果可能的话,更喜欢在编译时使用sbt参数构建java 7。
我怎样才能让SBT使用不同的java(假设fork一个java进程并指定一个完整路径)?如果sbt没有从java-home目录中生成javac,这会被视为SBT错误吗?
答案 0 :(得分:0)
您可以在build.sbt或Build.scala中为Scala编译器设置目标JVM:
scalacOptions + =" -target:jvm-1.7"