私は混合型のscala/javaプロジェクトを持ち、複数のJDKを持つホストを持っています。デフォルトのjava(代替手段を介して)はjdk8です。別のjava-homeを指定してプロジェクトをビルドすると、javaソースはパス上のデフォルトのjdkを使用してビルドされます。sbtとjava-homeはデフォルトのjdkを使用してJavaソースをコンパイルします
$ java -version
java version "1.8.0_20"
/usr/bin/java
は、ホストの設定に従って/usr/lib/jvm/jdk8/bin/java
にリンクされている/etc/alternatives/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
あなたが見ることができるようにScalaのソースをビルドするためにJDK7を使用しながら、Javaのソースは、(java
プロセスはデフォルトのパスから生み出されていると仮定した場合)のjava 8にまとめました。私は、ビルド定義にjavacOptionsを指定することにより、Java 7のためにコンパイルするJavaソースを取得することができています:
javacOptions ++= Seq("-source","1.7","-target", "1.7")
が、私は、ビルドソースでこれを行うことを回避し、Java 7のために構築することを好むしたいのですが可能であれば、sbtパラメータをコンパイル時に使用します。
SBTに別のJavaを使用させるにはどうすればよいですか(Javaプロセスをforkしてフルパスを指定すると仮定します)。 sbtがjava-homeディレクトリからjavacを起動しない場合、これはSBTバグと見なされますか?
おかげで - 'しかし私可能であれば、ビルドソースでこれを行う必要を避け、sbtパラメータでコンパイル時にJava 7をビルドする方が好きです。 – Brett
この場合、コマンドラインでsbtを実行すると、次のことができます:JAVA_HOME = < path-to-jdk-home> sbtです。これは、実行されているsbtのこのインスタンスのJavaホームパスを設定します –
これを試してみてください。うまくいきませんでした。 'export JAVA_HOME =/usr/lib/jvm/jdk7; sbt -java-home/usr/lib/jvm/jdk7コンパイル - スカラソースのクラスは、メジャーバージョン50とjavaソース52のクラスを表示します。 – Brett