Skip to content

Commit

Permalink
Try using classutil to find Spark classes.
Browse files Browse the repository at this point in the history
  • Loading branch information
JoshRosen committed Feb 13, 2016
1 parent 9fc0f7a commit 31854eb
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 34 deletions.
2 changes: 1 addition & 1 deletion dev/mima
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ generate_mima_ignore() {
java \
-XX:MaxPermSize=1g \
-Xmx2g \
-cp "$1:$TOOLS_CLASSPATH" \
-cp "$TOOLS_CLASSPATH:$1" \
org.apache.spark.tools.GenerateMIMAIgnore
}

Expand Down
5 changes: 5 additions & 0 deletions tools/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,11 @@
<groupId>org.scala-lang</groupId>
<artifactId>scala-compiler</artifactId>
</dependency>
<dependency>
<groupId>org.clapper</groupId>
<artifactId>classutil_${scala.binary.version}</artifactId>
<version>1.0.6</version>
</dependency>
</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,13 @@
// scalastyle:off classforname
package org.apache.spark.tools

import java.io.File
import java.util.jar.JarFile

import scala.collection.mutable
import scala.collection.JavaConverters._
import scala.reflect.runtime.{universe => unv}
import scala.reflect.runtime.universe.runtimeMirror
import scala.util.Try

import org.clapper.classutil.ClassFinder

/**
* A tool for generating classes to be excluded during binary checking with MIMA. It is expected
* that this tool is run with ./spark-class.
Expand Down Expand Up @@ -161,35 +159,13 @@ object GenerateMIMAIgnore {
* and subpackages both from directories and jars present on the classpath.
*/
private def getClasses(packageName: String): Set[String] = {
val path = packageName.replace('.', '/')
val resources = classLoader.getResources(path)

val jars = resources.asScala.filter(_.getProtocol == "jar")
.map(_.getFile.split(":")(1).split("!")(0)).toSeq

jars.flatMap(getClassesFromJar(_, path))
.map(_.getName)
.filterNot(shouldExclude).toSet
}

/**
* Get all classes in a package from a jar file.
*/
private def getClassesFromJar(jarPath: String, packageName: String) = {
import scala.collection.mutable
val jar = new JarFile(new File(jarPath))
val enums = jar.entries().asScala.map(_.getName).filter(_.startsWith(packageName))
val classes = mutable.HashSet[Class[_]]()
for (entry <- enums if entry.endsWith(".class")) {
try {
classes += Class.forName(entry.replace('/', '.').stripSuffix(".class"), false, classLoader)
} catch {
// scalastyle:off println
case _: Throwable => println("Unable to load:" + entry)
// scalastyle:on println
}
}
classes
val finder = ClassFinder()
finder
.getClasses
.map(_.name)
.filter(_.startsWith(packageName))
.filterNot(shouldExclude)
.toSet
}
}
// scalastyle:on classforname

0 comments on commit 31854eb

Please sign in to comment.