2016-05-18 15 views
0

私は混合型の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バグと見なされますか?

答えて

0

あなたはbuild.sbtまたはBuild.scalaでScalaのコンパイラのターゲットJVMを設定することができます。

scalacOptions + = "-target:JVM-1.7" の提案アンドリューため

+0

おかげで - 'しかし私可能であれば、ビルドソースでこれを行う必要を避け、sbtパラメータでコンパイル時にJava 7をビルドする方が好きです。 – Brett

+0

この場合、コマンドラインでsbtを実行すると、次のことができます:JAVA_HOME = < path-to-jdk-home> sbtです。これは、実行されているsbtのこのインスタンスのJavaホームパスを設定します –

+0

これを試してみてください。うまくいきませんでした。 'export JAVA_HOME =/usr/lib/jvm/jdk7; sbt -java-home/usr/lib/jvm/jdk7コンパイル - スカラソースのクラスは、メジャーバージョン50とjavaソース52のクラスを表示します。 – Brett

関連する問題