2013-12-11 39 views
2

我在混合的Java/Scala項目中使用sbt。不幸的是,sbt似乎沒有對Java源進行任何依賴關係分析。例如,如果A.java取決於B.java並且我改變B.java,則它不費心重新編譯A.java。我想這是一個錯誤,但我需要一個解決方法。讓sbt重新編譯受影響的Java源代碼

唯一的解決辦法是做clear compile這很糟糕,因爲它會在IDEA項目中擦除我的javadoc和源代碼。我也嘗試打開bash並運行rm -r target/classes/,但情況更糟。 Sbt仍然沒有看到它需要重新編譯Java源代碼,只是抱怨說當我從Scala中引用它們時,這些類不存在。

是否有一種方法可以迫使sbt重新編譯所有Java源代碼?


編輯:重現:

$ git clone https://github.com/Sciss/TreeTable.git 
... 
$ cd TreeTable 
$ git checkout 00daa4288574b658c8bb643cb2ddf9768195c50a 
$ sbt compile 

這將編譯該項目。 SBT會崩潰在某些點:再次

[info] Loading global plugins from /Users/hhrutz/.sbt/0.13/plugins 
[info] Loading project definition from /Users/hhrutz/Desktop/sbtprob/TreeTable/project 
[info] Updating {file:/Users/hhrutz/Desktop/sbtprob/TreeTable/project/}treetable-build... 
[info] Resolving org.fusesource.jansi#jansi;1.4 ... 
[info] Done updating. 
[info] Compiling 1 Scala source to /Users/hhrutz/Desktop/sbtprob/TreeTable/project/target/scala-2.10/sbt-0.13/classes... 
[info] Set current project to TreeTable (in build file:/Users/hhrutz/Desktop/sbtprob/TreeTable/) 
[info] Updating {file:/Users/hhrutz/Desktop/sbtprob/TreeTable/}treetable-java... 
[info] Resolving org.fusesource.jansi#jansi;1.4 ... 
[info] Done updating. 
[info] Updating {file:/Users/hhrutz/Desktop/sbtprob/TreeTable/}treetable-scala... 
[info] Resolving org.scala-lang#scala-swing;2.10.2 ... 
[info] Compiling 29 Java sources to /Users/hhrutz/Desktop/sbtprob/TreeTable/java/target/classes... 
[info] Resolving org.fusesource.jansi#jansi;1.4 ... 
[info] Done updating. 
[info] Updating {file:/Users/hhrutz/Desktop/sbtprob/TreeTable/}treetable... 
[info] Resolving org.fusesource.jansi#jansi;1.4 ... 
[info] Done updating. 
[warn] Note: Some input files use unchecked or unsafe operations. 
[warn] Note: Recompile with -Xlint:unchecked for details. 
java.lang.reflect.GenericSignatureFormatError 
    at sun.reflect.generics.parser.SignatureParser.error(SignatureParser.java:103) 
    at sun.reflect.generics.parser.SignatureParser.parseSimpleClassTypeSignature(SignatureParser.java:262) 
    at sun.reflect.generics.parser.SignatureParser.parseClassTypeSignatureSuffix(SignatureParser.java:270) 
    at sun.reflect.generics.parser.SignatureParser.parseClassTypeSignature(SignatureParser.java:244) 
    at sun.reflect.generics.parser.SignatureParser.parseFieldTypeSignature(SignatureParser.java:228) 
    at sun.reflect.generics.parser.SignatureParser.parseTypeSignature(SignatureParser.java:359) 
    at sun.reflect.generics.parser.SignatureParser.parseReturnType(SignatureParser.java:490) 
    at sun.reflect.generics.parser.SignatureParser.parseMethodTypeSignature(SignatureParser.java:436) 
    at sun.reflect.generics.parser.SignatureParser.parseMethodSig(SignatureParser.java:141) 
    at sun.reflect.generics.repository.ConstructorRepository.parse(ConstructorRepository.java:37) 
    at sun.reflect.generics.repository.ConstructorRepository.parse(ConstructorRepository.java:25) 
    at sun.reflect.generics.repository.AbstractRepository.<init>(AbstractRepository.java:56) 
    at sun.reflect.generics.repository.GenericDeclRepository.<init>(GenericDeclRepository.java:30) 
    at sun.reflect.generics.repository.ConstructorRepository.<init>(ConstructorRepository.java:33) 
    at sun.reflect.generics.repository.MethodRepository.<init>(MethodRepository.java:28) 
    at sun.reflect.generics.repository.MethodRepository.make(MethodRepository.java:41) 
    at java.lang.reflect.Method.getGenericInfo(Method.java:94) 
    at java.lang.reflect.Method.getTypeParameters(Method.java:196) 
    at sbt.ClassToAPI$.methodToDef(ClassToAPI.scala:143) 
    at sbt.ClassToAPI$$anonfun$7.apply(ClassToAPI.scala:73) 
    at sbt.ClassToAPI$$anonfun$7.apply(ClassToAPI.scala:73) 
    at sbt.ClassToAPI$$anonfun$mergeMap$1.apply(ClassToAPI.scala:175) 
    at sbt.ClassToAPI$$anonfun$mergeMap$1.apply(ClassToAPI.scala:175) 
    at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:251) 
    at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:251) 
    at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33) 
    at scala.collection.mutable.WrappedArray.foreach(WrappedArray.scala:34) 
    at scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:251) 
    at scala.collection.AbstractTraversable.flatMap(Traversable.scala:105) 
    at sbt.ClassToAPI$.merge(ClassToAPI.scala:181) 
    at sbt.ClassToAPI$.mergeMap(ClassToAPI.scala:175) 
    at sbt.ClassToAPI$.structure(ClassToAPI.scala:73) 
    at sbt.ClassToAPI$.x$2$lzycompute$1(ClassToAPI.scala:62) 
    at sbt.ClassToAPI$.x$2$1(ClassToAPI.scala:62) 
    at sbt.ClassToAPI$.instance$lzycompute$1(ClassToAPI.scala:62) 
    at sbt.ClassToAPI$.sbt$ClassToAPI$$instance$1(ClassToAPI.scala:62) 
    at sbt.ClassToAPI$$anonfun$5.apply(ClassToAPI.scala:63) 
    at sbt.ClassToAPI$$anonfun$5.apply(ClassToAPI.scala:63) 
    at xsbti.SafeLazy$Impl._t$lzycompute(SafeLazy.scala:20) 
    at xsbti.SafeLazy$Impl._t(SafeLazy.scala:18) 
    at xsbti.SafeLazy$Impl.get(SafeLazy.scala:24) 
    at sbt.ClassToAPI$$anonfun$process$1.apply(ClassToAPI.scala:22) 
    at sbt.ClassToAPI$$anonfun$process$1.apply(ClassToAPI.scala:22) 
    at scala.collection.immutable.List.foreach(List.scala:318) 
    at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:32) 
    at scala.collection.mutable.ListBuffer.foreach(ListBuffer.scala:45) 
    at sbt.ClassToAPI$.process(ClassToAPI.scala:22) 
    at sbt.compiler.AggressiveCompile$$anonfun$3.sbt$compiler$AggressiveCompile$$anonfun$$readAPI$1(AggressiveCompile.scala:130) 
    at sbt.compiler.AggressiveCompile$$anonfun$3$$anonfun$compileJava$1$2$$anonfun$apply$mcV$sp$2$$anonfun$apply$6.apply(AggressiveCompile.scala:138) 
    at sbt.compiler.AggressiveCompile$$anonfun$3$$anonfun$compileJava$1$2$$anonfun$apply$mcV$sp$2$$anonfun$apply$6.apply(AggressiveCompile.scala:138) 
    at sbt.classfile.Analyze$$anonfun$apply$9.apply(Analyze.scala:45) 
    at sbt.classfile.Analyze$$anonfun$apply$9.apply(Analyze.scala:43) 
    at scala.collection.TraversableLike$WithFilter$$anonfun$foreach$1.apply(TraversableLike.scala:772) 
    at scala.collection.mutable.HashMap$$anonfun$foreach$1.apply(HashMap.scala:98) 
    at scala.collection.mutable.HashMap$$anonfun$foreach$1.apply(HashMap.scala:98) 
    at scala.collection.mutable.HashTable$class.foreachEntry(HashTable.scala:226) 
    at scala.collection.mutable.HashMap.foreachEntry(HashMap.scala:39) 
    at scala.collection.mutable.HashMap.foreach(HashMap.scala:98) 
    at scala.collection.TraversableLike$WithFilter.foreach(TraversableLike.scala:771) 
    at sbt.classfile.Analyze$.apply(Analyze.scala:43) 
    at sbt.compiler.AggressiveCompile$$anonfun$3$$anonfun$compileJava$1$2$$anonfun$apply$mcV$sp$2.apply(AggressiveCompile.scala:138) 
    at sbt.compiler.AggressiveCompile$$anonfun$3$$anonfun$compileJava$1$2$$anonfun$apply$mcV$sp$2.apply(AggressiveCompile.scala:136) 
    at scala.collection.TraversableLike$WithFilter$$anonfun$foreach$1.apply(TraversableLike.scala:772) 
    at scala.collection.immutable.List.foreach(List.scala:318) 
    at scala.collection.TraversableLike$WithFilter.foreach(TraversableLike.scala:771) 
    at sbt.compiler.AggressiveCompile$$anonfun$3$$anonfun$compileJava$1$2.apply$mcV$sp(AggressiveCompile.scala:136) 
    at sbt.compiler.AggressiveCompile$$anonfun$3$$anonfun$compileJava$1$2.apply(AggressiveCompile.scala:136) 
    at sbt.compiler.AggressiveCompile$$anonfun$3$$anonfun$compileJava$1$2.apply(AggressiveCompile.scala:136) 
    at sbt.compiler.AggressiveCompile.sbt$compiler$AggressiveCompile$$timed(AggressiveCompile.scala:159) 
    at sbt.compiler.AggressiveCompile$$anonfun$3.compileJava$1(AggressiveCompile.scala:135) 
    at sbt.compiler.AggressiveCompile$$anonfun$3.apply(AggressiveCompile.scala:142) 
    at sbt.compiler.AggressiveCompile$$anonfun$3.apply(AggressiveCompile.scala:86) 
    at sbt.inc.IncrementalCompile$$anonfun$doCompile$1.apply(Compile.scala:38) 
    at sbt.inc.IncrementalCompile$$anonfun$doCompile$1.apply(Compile.scala:36) 
    at sbt.inc.Incremental$.cycle(Incremental.scala:73) 
    at sbt.inc.Incremental$$anonfun$1.apply(Incremental.scala:33) 
    at sbt.inc.Incremental$$anonfun$1.apply(Incremental.scala:32) 
    at sbt.inc.Incremental$.manageClassfiles(Incremental.scala:41) 
    at sbt.inc.Incremental$.compile(Incremental.scala:32) 
    at sbt.inc.IncrementalCompile$.apply(Compile.scala:26) 
    at sbt.compiler.AggressiveCompile.compile2(AggressiveCompile.scala:150) 
    at sbt.compiler.AggressiveCompile.compile1(AggressiveCompile.scala:70) 
    at sbt.compiler.AggressiveCompile.apply(AggressiveCompile.scala:45) 
    at sbt.Compiler$.apply(Compiler.scala:70) 
    at sbt.Defaults$.sbt$Defaults$$compileTaskImpl(Defaults.scala:722) 
    at sbt.Defaults$$anonfun$compileTask$1.apply(Defaults.scala:716) 
    at sbt.Defaults$$anonfun$compileTask$1.apply(Defaults.scala:716) 
    at scala.Function1$$anonfun$compose$1.apply(Function1.scala:47) 
    at sbt.$tilde$greater$$anonfun$$u2219$1.apply(TypeFunctions.scala:42) 
    at sbt.std.Transform$$anon$4.work(System.scala:64) 
    at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:237) 
    at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:237) 
    at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:18) 
    at sbt.Execute.work(Execute.scala:244) 
    at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:237) 
    at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:237) 
    at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:160) 
    at sbt.CompletionService$$anon$2.call(CompletionService.scala:30) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) 
    at java.lang.Thread.run(Thread.java:695) 

運行完成編譯:

$ sbt compile 
[info] Loading global plugins from /Users/hhrutz/.sbt/0.13/plugins 
[info] Loading project definition from /Users/hhrutz/Desktop/sbtprob/TreeTable/project 
[info] Set current project to TreeTable (in build file:/Users/hhrutz/Desktop/sbtprob/TreeTable/) 
[info] Compiling 29 Java sources to /Users/hhrutz/Desktop/sbtprob/TreeTable/java/target/classes... 
[warn] Note: Some input files use unchecked or unsafe operations. 
[warn] Note: Recompile with -Xlint:unchecked for details. 
[info] Compiling 8 Scala sources to /Users/hhrutz/Desktop/sbtprob/TreeTable/scala/target/scala-2.10/classes... 
[success] Total time: 20 s, completed Dec 11, 2013 4:06:48 PM 

確定。現在進行編輯。

$ vi java/src/main/java/de/sciss/treetable/j/ui/TreeTableUI.java 

對於管線35從DefaultTreeTableCellRenderer rendererTreeTableCellRenderer renderer示例變化。保存並退出vi。

再次運行編譯:

$ sbt compile 
[info] Loading global plugins from /Users/hhrutz/.sbt/0.13/plugins 
[info] Loading project definition from /Users/hhrutz/Desktop/sbtprob/TreeTable/project 
[info] Set current project to TreeTable (in build file:/Users/hhrutz/Desktop/sbtprob/TreeTable/) 
[info] Compiling 1 Java source to /Users/hhrutz/Desktop/sbtprob/TreeTable/java/target/classes... 
[success] Total time: 1 s, completed Dec 11, 2013 4:08:40 PM 

很明顯,這也只是重新編譯TreeTableUI.java,而實現類BasicTreeTableUI現在是腐敗,就需要重新編譯。強制重新編譯的唯一方法是清理項目。

+0

測試用例可能是必需的。至少配置依賴項的構建定義的相關部分(包括sbt版本)很有幫助。 Java源代碼是按照依賴信息在類文件中進行增量編譯的(例如,sbt無法知道內聯常量,因爲它們不在類文件中)。增量編譯當然應該處理Java源代碼和混合項目。 –

+0

@MarkHarrah - 我附上了一個測試用例。也許這個問題是由暫時的編譯器崩潰產生的,我不知道。如果我用'javac'編譯java源文件,它不會崩潰,所以這不是我安裝java的問題。 –

+0

順便說一句,無關。最近幾乎在我的每個項目中,我都注意到了這個令人討厭的「解析org.fusesource.jansi#jansi; 1.4 ...」。任何線索來自哪裏,爲什麼它檢查出5(!)次? –

回答