1. Java ソース

Java ソース 

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 列挙型からのものです: MixedJavaThenScala、および 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 に記載されているいくつかの兆候があります

  1. (リテラルでない) 定数変数の選択は、Java アノテーションの引数として使用される場合、拒否されます (コンパイル時定数式が必要です)。
  2. 定数変数の選択は、その値に置き換えられませんが、実際のフィールドロードとしてコンパイルされます (Scala 仕様 4.1 では、定数式はその値に置き換えられるべきであると定義されています)。

Scala 2.11.4 以降、Scala クラスで Java 定義のアノテーションを使用する場合にも同様の問題が発生します。Scala コンパイラは、ソースからアノテーション @interface を解析するときに @Retention アノテーションを認識しないため、可視性 RUNTIME でアノテーションを出力します (SI-8928)。

Scala ソースディレクトリの無視 

デフォルトでは、sbt は src/main/scalasrc/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 ディレクトリが空の場合は、そのままにしておいても問題ありません。