From 0aa23bf17e0dfeb985b9298141fab5003d74199c Mon Sep 17 00:00:00 2001
From: Matei Zaharia <matei@eecs.berkeley.edu>
Date: Mon, 29 Aug 2011 22:59:44 -0700
Subject: [PATCH] Added a convenience method for getting the JAR file that
 loaded a class (useful for jobs to pass their own JAR files to SparkContext).

---
 core/src/main/scala/spark/SparkContext.scala | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/core/src/main/scala/spark/SparkContext.scala b/core/src/main/scala/spark/SparkContext.scala
index f7cc614fc1..598432c94a 100644
--- a/core/src/main/scala/spark/SparkContext.scala
+++ b/core/src/main/scala/spark/SparkContext.scala
@@ -353,6 +353,24 @@ object SparkContext {
 
   implicit def writableWritableConverter[T <: Writable]() =
     new WritableConverter[T](_.erasure.asInstanceOf[Class[T]], _.asInstanceOf[T])
+
+  // Find the JAR from which a given class was loaded, to make it easy for users to pass
+  // their JARs to SparkContext
+  def jarOfClass[T: ClassManifest]: Option[String] = {
+    val cls = classManifest[T].erasure
+    val uri = cls.getResource("/" + cls.getName.replace('.', '/') + ".class")
+    if (uri != null) {
+      val uriStr = uri.toString
+      if (uriStr.startsWith("jar:file:")) {
+        // URI will be of the form "jar:file:/path/foo.jar!/package/cls.class", so pull out the /path/foo.jar
+        Some(uriStr.substring("jar:file:".length, uriStr.indexOf('!')))
+      } else {
+        None
+      }
+    } else {
+      None
+    }
+  }
 }
 
 
-- 
GitLab