From bad073408d00f1ca1efd8abc37e635e0e73d2a83 Mon Sep 17 00:00:00 2001 From: Mark Harrah Date: Mon, 14 Dec 2009 18:39:15 -0500 Subject: [PATCH] Fix Java dependency tracking in 0.6.x --- src/main/scala/sbt/ClasspathUtilities.scala | 12 +++++++++++- src/main/scala/sbt/Compile.scala | 1 + src/main/scala/sbt/Conditional.scala | 7 ++++++- src/main/scala/sbt/classfile/Analyze.scala | 2 +- 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/main/scala/sbt/ClasspathUtilities.scala b/src/main/scala/sbt/ClasspathUtilities.scala index 8852d6bdf..1b924018e 100644 --- a/src/main/scala/sbt/ClasspathUtilities.scala +++ b/src/main/scala/sbt/ClasspathUtilities.scala @@ -15,9 +15,19 @@ object ClasspathUtilities def toClasspath(paths: Iterable[Path]): Array[URL] = paths.map(_.asURL).toSeq.toArray def toLoader(finder: PathFinder): ClassLoader = toLoader(finder.get) def toLoader(finder: PathFinder, parent: ClassLoader): ClassLoader = toLoader(finder.get, parent) - def toLoader(paths: Iterable[Path]): ClassLoader = new URLClassLoader(toClasspath(paths), getClass.getClassLoader) + def toLoader(paths: Iterable[Path]): ClassLoader = new URLClassLoader(toClasspath(paths), rootLoader) def toLoader(paths: Iterable[Path], parent: ClassLoader): ClassLoader = new URLClassLoader(toClasspath(paths), parent) + lazy val rootLoader = + { + def parent(loader: ClassLoader): ClassLoader = + { + val p = loader.getParent + if(p eq null) loader else parent(p) + } + parent(getClass.getClassLoader) + } + private[sbt] def printSource(c: Class[_]) = println(c.getName + " loader=" +c.getClassLoader + " location=" + FileUtilities.classLocationFile(c)) diff --git a/src/main/scala/sbt/Compile.scala b/src/main/scala/sbt/Compile.scala index f6991eaae..ec8f44617 100644 --- a/src/main/scala/sbt/Compile.scala +++ b/src/main/scala/sbt/Compile.scala @@ -79,6 +79,7 @@ final class Compile(maximumErrors: Int, compiler: AnalyzingCompiler, analysisCal protected def processJava(sources: Set[File], classpath: Set[File], outputDirectory: File, options: Seq[String], log: Logger) { val arguments = (new CompilerArguments(compiler.scalaInstance))(sources, classpath, outputDirectory, options, true) + log.debug("Calling 'javac' with arguments:\n\t" + arguments.mkString("\n\t")) val code = Process("javac", arguments) ! log if( code != 0 ) throw new CompileFailed(arguments.toArray, "javac returned nonzero exit code") } diff --git a/src/main/scala/sbt/Conditional.scala b/src/main/scala/sbt/Conditional.scala index 0f6519a3e..817465615 100644 --- a/src/main/scala/sbt/Conditional.scala +++ b/src/main/scala/sbt/Conditional.scala @@ -310,6 +310,11 @@ abstract class AbstractCompileConditional(val config: AbstractCompileConfigurati } }) } + private def scalaJars: Iterable[Path] = + { + val instance = compiler.scalaInstance + Seq(instance.libraryJar, instance.compilerJar).map(Path.fromFile) + } protected def execute(executeAnalysis: ConditionalAnalysis) = { log.info(executeAnalysis.toString) @@ -328,7 +333,7 @@ abstract class AbstractCompileConditional(val config: AbstractCompileConfigurati val compile = new Compile(config.maxErrors, compiler, analysisCallback, projectPath) compile(label, dirtySources, cp, outputDirectory, options, javaOptions, compileOrder, log) } - val loader = ClasspathUtilities.toLoader(cp) + val loader = ClasspathUtilities.toLoader(cp ++ scalaJars) val r = classfile.Analyze(projectPath, outputDirectory, dirtySources, sourceRoots.get, log)(analysis.allProducts, analysisCallback, loader)(run) if(log.atLevel(Level.Debug)) { diff --git a/src/main/scala/sbt/classfile/Analyze.scala b/src/main/scala/sbt/classfile/Analyze.scala index 8de27e240..1f54bdf81 100644 --- a/src/main/scala/sbt/classfile/Analyze.scala +++ b/src/main/scala/sbt/classfile/Analyze.scala @@ -53,7 +53,7 @@ private[sbt] object Analyze { val loaded = try { Some(Class.forName(tpe, false, loader)) } - catch { case e: NoClassDefFoundError => log.warn("Problem processing dependencies of source " + source + " : " +e.toString); None } + catch { case e => log.warn("Problem processing dependencies of source " + source + " : " +e.toString); None } for(clazz <- loaded; file <- Control.convertException(FileUtilities.classLocationFile(clazz)).right) { if(file.isDirectory)