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 來源程式碼。如果您沒有循環依賴,您可以使用其他兩個選項之一來加速您的建置,而無需將 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 來源程式碼中的編譯時間常數變數(Java 規格 4.12.4)的定義不是常值,則 Scala 編譯器不會識別它們。此問題有幾個徵兆,詳述於 Scala 票證 SI-5333
自 Scala 2.11.4 起,當在 Scala 類別中使用 Java 定義的註解時,也會出現類似的問題。當從來源程式碼剖析註解 @interface
時,Scala 編譯器無法辨識 @Retention
註解,因此會發出可見度為 RUNTIME
的註解 (SI-8928)。
依預設,sbt 會在其未受管理來源程式碼目錄清單中包含 src/main/scala
和 src/main/java
。對於僅限 Java 的專案,可以透過修改 unmanagedSourceDirectories
來忽略不必要的 Scala 目錄
// 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 目錄為空,則保留它們不會造成任何損害。