使sbt重新编译受影响的Java源

使sbt重新编译受影响的Java源,java,scala,sbt,Java,Scala,Sbt,我正在一个混合Java/Scala项目中使用sbt。不幸的是,sbt似乎没有对Java源代码进行任何依赖性分析。例如,如果A.java依赖于B.java,而我改变了B.java,它就不需要重新编译A.java。我想这是一个bug,但我需要一个解决方法 唯一的解决方案是执行清除编译,这很糟糕,因为它会在IDEA项目中删除我的javadocs和源代码。我还试图打开一个bash并运行rm-r target/classes/,但这更糟糕。Sbt仍然不认为需要重新编译Java源代码,只是在我从Scala中

我正在一个混合Java/Scala项目中使用sbt。不幸的是,sbt似乎没有对Java源代码进行任何依赖性分析。例如,如果
A.java
依赖于
B.java
,而我改变了
B.java
,它就不需要重新编译
A.java
。我想这是一个bug,但我需要一个解决方法

唯一的解决方案是执行
清除编译
,这很糟糕,因为它会在IDEA项目中删除我的javadocs和源代码。我还试图打开一个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)
嗯。现在进行编辑

$ vi java/src/main/java/de/sciss/treetable/j/ui/TreeTableUI.java
例如,将第35行中的
DefaultTreeTableCellRenderer
更改为
TreeTableCellRenderer
。保存并退出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
现在已损坏,需要重新编译。强制重新编译的唯一方法是清理项目。

OP字段,该字段由0.13分支中的标记固定,现在作为sbt 0.13.2提供。

可能需要一个测试用例。至少,构建定义中配置依赖项的相关部分(包括sbt版本)是有帮助的。Java源代码是增量编译的,依赖信息在类文件中(例如,sbt不能知道内联常量,因为它们不在类文件中)。增量编译当然应该处理Java源代码和混合项目,否则。@MarkHarrah-I附带了一个测试用例。也许这个问题是由暂时的编译器崩溃造成的,我不知道。如果我使用
javac
编译java源代码,它不会崩溃,因此这不是我的java安装的问题。顺便说一句,这与我的java安装无关。我注意到这个恼人的
解析org.fusesource.jansi#jansi;1.4…
最近几乎在矿山的每个项目中。有什么线索是从哪里来的,为什么要查5次?!是的,问题在于撞车。javac成功了,但当sbt加载类文件以提取依赖信息时,Java反射失败。目前还不清楚这是Java反射还是
javac
中的错误,也可能是sbt中的错误。现在请打开sbt上的一个bug。您使用的是什么版本的Java?也许您正在以运行sbt的Java版本无法理解的格式生成类文件?啊,好吧,我确实提交了错误,对不起,我的内存是一块瑞士奶酪。
$ 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