@@ -74,15 +74,32 @@ private class QuoteDriver(appClassloader: ClassLoader) extends Driver {
74
74
*/
75
75
private def classpathFromClassloader (cl : ClassLoader ): String = {
76
76
val classpathBuff = List .newBuilder[String ]
77
- def collectClassLoaderPaths (cl : ClassLoader ): Unit = cl match {
78
- case cl : URLClassLoader =>
79
- collectClassLoaderPaths(cl.getParent)
80
- // Parent classloaders are searched before their child, so the part of
81
- // the classpath coming from the child is added at the _end_ of the
82
- // classpath.
83
- classpathBuff ++=
84
- cl.getURLs.iterator.map(url => Paths .get(url.toURI).toAbsolutePath.toString)
85
- case _ =>
77
+ def collectClassLoaderPaths (cl : ClassLoader ): Unit = {
78
+ if (cl != null ) {
79
+ cl match {
80
+ case cl : URLClassLoader =>
81
+ // This is wrong if we're in a subclass of URLClassLoader
82
+ // that filters loading classes from its parent ¯\_(ツ)_/¯
83
+ collectClassLoaderPaths(cl.getParent)
84
+ // Parent classloaders are searched before their child, so the part of
85
+ // the classpath coming from the child is added at the _end_ of the
86
+ // classpath.
87
+ classpathBuff ++=
88
+ cl.getURLs.iterator.map(url => Paths .get(url.toURI).toAbsolutePath.toString)
89
+ case _ =>
90
+ // HACK: We can't just collect the classpath from arbitrary parent
91
+ // classloaders since the current classloader might intentionally
92
+ // filter loading classes from its parent (for example
93
+ // BootFilteredLoader in the sbt launcher does this and we really
94
+ // don't want to include the scala-library that sbt depends on
95
+ // here), but we do need to look at the parent of the REPL
96
+ // classloader, so we special case it. We can't do this using a type
97
+ // test since the REPL classloader class itself is normally loaded
98
+ // with a different classloader.
99
+ if (cl.getClass.getName == classOf [AbstractFileClassLoader ].getName)
100
+ collectClassLoaderPaths(cl.getParent)
101
+ }
102
+ }
86
103
}
87
104
collectClassLoaderPaths(cl)
88
105
classpathBuff.result().mkString(java.io.File .pathSeparator)
0 commit comments