sbt は、コンパイルされたクラスファイルに存在する依存関係の追跡に限定されるという制限付きで、Java ソースのコンパイルをサポートしています。
compile
は、デフォルトで src/main/java
配下のソースをコンパイルします。testCompile
は、デフォルトで src/test/java
配下のソースをコンパイルします。javacOptions
を設定して、Java コンパイラにオプションを渡します
javacOptions += "-g:none"
Scala コンパイラのオプションと同様に、引数は sbt によって解析されません。 -source 1.5
などの複数要素のオプションは、次のように指定されます
javacOptions ++= Seq("-source", "1.5")
compileOrder
設定を使用して、Scala と Java のソースをビルドする順序を指定できます。可能な値は CompileOrder
列挙型からのものです: Mixed
、JavaThenScala
、および ScalaThenJava
。 Scala ソースと Java ソースの間に循環依存関係がある場合は、デフォルトの Mixed
が必要です。これは、Java ソースと Scala ソースの両方を scalac
に渡し、次に javac
で Java ソースをコンパイルします。循環依存関係がない場合は、他の 2 つのオプションのいずれかを使用して、Java ソースを scalac
に渡さないことでビルドを高速化できます。たとえば、Scala ソースが Java ソースに依存しているが、Java ソースが Scala ソースに依存していない場合は、次のようにすることができます
compileOrder := CompileOrder.JavaThenScala
メインソースとテストソースに異なる順序を指定するには、設定を構成別にスコープします
// Java then Scala for main sources
Compile / compileOrder := CompileOrder.JavaThenScala
// allow circular dependencies for test sources
Test / compileOrder := CompileOrder.Mixed
インクリメンタルコンパイル設定では、Java ソースと Scala ソースは同じ出力ディレクトリを共有するため、Java ソースと Scala ソースを完全に分離することは実際的ではないことに注意してください。したがって、現在の再コンパイルに関係のない、以前にコンパイルされたクラスが取得される場合があります。ただし、クリーンコンパイルは常に完全なチェックを提供します。
Scala コンパイラは、Java ソースコード内のコンパイル時定数変数 (Java 仕様 4.12.4) を、その定義がリテラルでない場合に識別しません。この問題には、Scala チケット SI-5333 に記載されているいくつかの兆候があります
Scala 2.11.4 以降、Scala クラスで Java 定義のアノテーションを使用する場合にも同様の問題が発生します。Scala コンパイラは、ソースからアノテーション @interface
を解析するときに @Retention
アノテーションを認識しないため、可視性 RUNTIME
でアノテーションを出力します (SI-8928)。
デフォルトでは、sbt は src/main/scala
と src/main/java
を管理されていないソースディレクトリのリストに含めます。 Javaのみのプロジェクトの場合、不要な Scala ディレクトリは、unmanagedSourceDirectories
を変更することで無視できます
// Include only src/main/java in the compile configuration
Compile / unmanagedSourceDirectories := (Compile / javaSource).value :: Nil
// Include only src/test/java in the test configuration
Test / unmanagedSourceDirectories := (Test / javaSource).value :: Nil
ただし、Scala ディレクトリが空の場合は、そのままにしておいても問題ありません。