2012-10-19 6 views
6

SBT zawsze ma pełny odbudowy z powodu uzależnienia zmodyfikowanej binarnej: rt.jar:SBT zawsze ma pełne odbudowanie powodu zmodyfikowanej binarnej uzależnienia rt.jar

[debug] 
[debug] Initial source changes: 
[debug]  removed:Set() 
[debug]  added: Set() 
[debug]  modified: Set() 
[debug] Removed products: Set() 
[debug] Modified external sources: Set() 
[debug] Modified binary dependencies: Set(C:\Program Files\Java\jdk1.6.0_37\jre\lib\rt.jar) 
[debug] Initial directly invalidated sources: Set() 

Oczywiście rt.jar nie został zmieniony, jego tworzone/dostępy/zmodyfikowane daty są takie same i dość stare.

Jest w katalogu C: \ Program Files \ Java \ jdk1.6.0_37 \ jre \ lib \

JAVA_HOME jest ustawiony jako C: \ Progra ~ 1 \ Java \ jdk1.6.0_37

JAVA_HOME/bin jest w PATH.

Wszelkie pomysły, dlaczego sbt myśli rt.jar zostały zmienione?

+0

jestem coraz to też, w tym przypadku z/System/Biblioteka/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/jce.jar –

+0

To może, ale nie musi, dotyczyć ciebie, ale często dla mnie, gdy SBT decyduje się na opóźnienie, po prostu muszę go zrestartować żeby się opamiętał. – Dylan

+0

Czy jest szansa, że ​​uruchomisz dwa wystąpienia SBT z różnymi pakietami JDK? Wiem, że to mi się przydarzyło; Używałem jednego z pomysłów-sbt-plugin i jednego z wiersza poleceń. – retronym

Odpowiedz

3

Posiadałem zestaw JAVA_HOME na C: \ Progra ~ 1 \ Java \ jdk1.6.0_37 i sbt rozwiązano zależność jako C: \ Program Files \ Java \ jdk1.6.0_37 \ jre \ lib \ rt.jar. SBT wykorzystuje java.io.File.equals(), która nie jest poprawny, w tym przypadku:

W SBT/kompilacji/Inc/Incremental.scala:

def externalBinaryModified(entry: String => Option[File], analysis: File => Option[Analysis], previous: Stamps, current: ReadStamps)(implicit equivS: Equiv[Stamp]): File => Boolean = 
    dependsOn => 
     analysis(dependsOn).isEmpty && 
     orTrue(
      for { 
       name <- previous.className(dependsOn) 
       _ = println("Name: " + name) 
       e <- entry(name) 
       _ = println("entry: " + e) 
      } yield { 
       val resolved = Locate.resolve(e, name) 
       println("resolved: " + resolved) 
       println("dependsOn: " + dependsOn) 
       println("resolved != dependsOn: " + (resolved != dependsOn)) 
       (resolved != dependsOn) || !equivS.equiv(previous.binary(dependsOn), current.binary(resolved)) 
      } 
     ) 

daje następujący wynik:

Name: java.lang.Object 
entry: c:\Progra~1\Java\jdk1.6.0_37\jre\lib\rt.jar 
resolved: c:\Progra~1\Java\jdk1.6.0_37\jre\lib\rt.jar 
dependsOn: c:\Program Files\Java\jdk1.6.0_37\jre\lib\rt.jar 
resolved != dependsOn: true 

Tak więc sbt zawsze uważa, że ​​rt.jar zostało zmienione.

Obejście byłoby ustawienie JAVA_HOME do "c: \ Program Files \ Java \ jdk1.6.0_37" rozwiązaniem byłoby zrobić:

resolved.getCanonicalPath != dependsOn.getCanonicalPath 
+0

W moim przypadku ustawienie JAVA_HOME nie działało. Jestem na OSX 10.8. –

Powiązane problemy