使用java-home的sbt使用默认的jdk来编译java源代码

时间:2016-05-18 09:45:51

标签: java sbt

我有一个混合的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错误吗?

1 个答案:

答案 0 :(得分:0)

您可以在build.sbt或Build.scala中为Scala编译器设置目标JVM:

scalacOptions + =" -target:jvm-1.7"