2014-09-23 76 views
2

在我們的項目中,我們對通過編譯生成的.class文件進行了增強後處理。這個增強步驟實際上會修改生成的.class文件,然後覆蓋它。如何防止SBT重新編譯修改後的.class文件?

enhance <<= enhance triggeredBy (compile in Compile) 

問題是sbt有一個稱爲增量重新編譯的機制。它監視生成的.class文件。每次增強器都覆蓋生成的.class文件時,sbt會識別這些修改並在下一個編譯命令中重新編譯相關的源。

對我們來說,重新編譯是一項非常耗時的工作。我們想停止重新編譯修改過的.class文件。這可能意味着讓sbt只監視源變化,而不是輸出變化。

我做了一些搜索。但我發現這件事很少。現在我知道一個名爲Analysis的特性可能負責從源到輸出.class文件的映射。所以我向你們求助。 Ps:我們可以通過將增強的輸出放到另一個文件夾來解決這個問題,但這不是優選的。

+0

用已編譯的類創建單獨的項目,並將其作爲依賴項(庫)添加到您的播放項目中。 – 2014-09-23 13:45:47

+0

@AndrzejJozwik感謝您的評論。您建議的方式並不是首選,因爲它對我們的目標有很長的路要走。由於我們的項目是一個非常大的項目,增加的複雜性可能會導致更多的問題。我們希望能夠直接解決問題。 – Chenyu 2014-09-23 14:29:01

回答

0

我說過關於sbt監視輸出.class文件。當.class文件被修改時,它會重新編譯.class文件的源代碼。

經過一番研究,我們發現sbt通過其上次修改時間通知文件的修改。也就是說,我們可以通過在修改後回滾上次修改時間來欺騙sbt,以便sbt不會注意到任何更改。

所以,我們的解決方案是簡單而有效:

  1. 找到所有。類文件
  2. 記下他們的最後修改時間
  3. 做了增強
  4. 放回原最後修改時間

這是一個小把戲。我們仍然期望更強大的解決方案

1

sbt strongly discourages mutations to files。您應該生成不同的文件。通過這樣做,您將解決您的問題,因爲sbt的增量編譯器仍然會查看未更改的.class文件。你將有一些重新佈線做:

發送compile任務別處的輸出:

classDirectory in Compile := crossTarget.value/"classes-orig" 

處理與您的工具這些.class文件,並將它們發送到crossTarget.value/"classes"(原classDirectory

enhance <<= enhance triggeredBy (compile in Compile) 

enhance := { 
    val fromDir := (classesDirectory in Compile).value 
    val toDir := crossTarget.value/"classes" 
    ... 
} 

重新佈線productDirectories使用crossTarget.value/"classes"反正(否則它會去看着你的修改classDirectory

productDirectories in Compile := Seq(crossTarget.value/"classes") 

確保products取決於你enhance任務:

products in Compile <<= (products in Compile) dependsOn enhance 

你可能需要一些更重連,如果你有資源(見copyResources)。但基本上你應該能夠到達那裏。

相關問題