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 列舉:MixedJavaThenScalaScalaThenJava。如果您的 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

  1. 當選取的(非常值)常數變數用作 Java 註解的引數時(需要編譯時間常數表達式),會遭到拒絕。
  2. 常數變數的選取不會被其值取代,而是編譯為實際的欄位載入(Scala 規格 4.1 定義常數表達式應被其值取代)。

自 Scala 2.11.4 起,當在 Scala 類別中使用 Java 定義的註解時,也會出現類似的問題。當從來源程式碼剖析註解 @interface 時,Scala 編譯器無法辨識 @Retention 註解,因此會發出可見度為 RUNTIME 的註解 (SI-8928)。

忽略 Scala 來源程式碼目錄 

依預設,sbt 會在其未受管理來源程式碼目錄清單中包含 src/main/scalasrc/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 目錄為空,則保留它們不會造成任何損害。