Sbt always performs a complete rebuild due to a modified binary dependency rt.jar

Sbt always performs a complete rebuild due to a modified binary dependency: 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() 

Obviously rt.jar has not been changed, its created / access / modified dates are the same and quite old.

In c: \ Program Files \ Java \ jdk1.6.0_37 \ jre \ lib \

JAVA_HOME is set as C: \ Progra ~ 1 \ Java \ jdk1.6.0_37

JAVA_HOME / bin is in PATH.

Any ideas why sbt thinks rt.jar has been changed?

+6
source share
1 answer

I installed JAVA_HOME in C: \ Progra ~ 1 \ Java \ jdk1.6.0_37 and sbt resolved the dependency as C: \ Program Files \ Java \ jdk1.6.0_37 \ jre \ lib \ rt.jar. In this case, Sbt uses java.io.File.equals (), which is incorrect:

In sbt / compile / 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)) } ) 

gives the following result:

 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 

So sbt always thinks rt.jar has been changed.

A workaround would be to install JAVA_HOME in "c: \ Program Files \ Java \ jdk1.6.0_37" The solution should be as follows:

 resolved.getCanonicalPath != dependsOn.getCanonicalPath 
+3
source

Source: https://habr.com/ru/post/928102/


All Articles