diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/scala/tools/nsc/MainGenericRunner.scala | 23 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/ObjectRunner.scala | 14 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/io/Jar.scala | 8 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/util/ClassPath.scala | 14 |
4 files changed, 46 insertions, 13 deletions
diff --git a/src/compiler/scala/tools/nsc/MainGenericRunner.scala b/src/compiler/scala/tools/nsc/MainGenericRunner.scala index cef13843dc..cc1139f8a7 100644 --- a/src/compiler/scala/tools/nsc/MainGenericRunner.scala +++ b/src/compiler/scala/tools/nsc/MainGenericRunner.scala @@ -7,13 +7,28 @@ package scala.tools.nsc import java.net.URL import scala.tools.util.PathResolver - import io.{ File } import util.{ ClassPath, ScalaClassLoader } import Properties.{ versionString, copyrightString } import interpreter.{ ILoop } import GenericRunnerCommand._ +object JarRunner extends CommonRunner { + def runJar(settings: GenericRunnerSettings, jarPath: String, arguments: Seq[String]): Either[Throwable, Boolean] = { + val jar = new io.Jar(jarPath) + val mainClass = jar.mainClass getOrElse sys.error("Cannot find main class for jar: " + jarPath) + val jarURLs = ClassPath expandManifestPath jarPath + val urls = if (jarURLs.isEmpty) File(jarPath).toURL +: settings.classpathURLs else jarURLs + + if (settings.Ylogcp.value) { + Console.err.println("Running jar with these URLs as the classpath:") + urls foreach println + } + + runAndCatch(urls, mainClass, arguments) + } +} + /** An object that runs Scala code. It has three possible * sources for the code to run: pre-compiled code, a script file, * or interactive entry. @@ -56,11 +71,7 @@ class MainGenericRunner { case AsScript => ScriptRunner.runScriptAndCatch(settings, thingToRun, command.arguments) case AsJar => - ObjectRunner.runAndCatch( - File(thingToRun).toURL +: settings.classpathURLs, - new io.Jar(thingToRun).mainClass getOrElse sys.error("Cannot find main class for jar: " + thingToRun), - command.arguments - ) + JarRunner.runJar(settings, thingToRun, command.arguments) case Error => Right(false) case _ => diff --git a/src/compiler/scala/tools/nsc/ObjectRunner.scala b/src/compiler/scala/tools/nsc/ObjectRunner.scala index 6ff0718de7..110de7aad5 100644 --- a/src/compiler/scala/tools/nsc/ObjectRunner.scala +++ b/src/compiler/scala/tools/nsc/ObjectRunner.scala @@ -11,12 +11,7 @@ import util.ScalaClassLoader import java.lang.reflect.InvocationTargetException import util.Exceptional.unwrap -/** An object that runs another object specified by name. - * - * @author Lex Spoon - * @version 1.1, 2007/7/13 - */ -object ObjectRunner { +trait CommonRunner { /** Check whether a class with the specified name * exists on the specified class path. */ def classExists(urls: List[URL], objectName: String): Boolean = @@ -41,3 +36,10 @@ object ObjectRunner { catch { case e => Left(unwrap(e)) } } } + +/** An object that runs another object specified by name. + * + * @author Lex Spoon + * @version 1.1, 2007/7/13 + */ +object ObjectRunner extends CommonRunner { } diff --git a/src/compiler/scala/tools/nsc/io/Jar.scala b/src/compiler/scala/tools/nsc/io/Jar.scala index ad1598a85d..bbed5a9e20 100644 --- a/src/compiler/scala/tools/nsc/io/Jar.scala +++ b/src/compiler/scala/tools/nsc/io/Jar.scala @@ -40,7 +40,15 @@ class Jar(file: File) extends Iterable[JarEntry] { lazy val jarFile = new JarFile(file.jfile) lazy val manifest = withJarInput(s => Option(s.getManifest)) + def mainClass = manifest map (f => f(Name.MAIN_CLASS)) + /** The manifest-defined classpath String if available. */ + def classPathString: Option[String] = + for (m <- manifest ; cp <- m.attrs get Name.CLASS_PATH) yield cp + def classPathElements: List[String] = classPathString match { + case Some(s) => s split "\\s+" toList + case _ => Nil + } def withJarInput[T](f: JarInputStream => T): T = { val in = new JarInputStream(file.inputStream()) diff --git a/src/compiler/scala/tools/nsc/util/ClassPath.scala b/src/compiler/scala/tools/nsc/util/ClassPath.scala index 484f809e6f..622b4db2a2 100644 --- a/src/compiler/scala/tools/nsc/util/ClassPath.scala +++ b/src/compiler/scala/tools/nsc/util/ClassPath.scala @@ -13,6 +13,7 @@ import io.{ File, Directory, Path, Jar, AbstractFile, ClassAndJarInfo } import scala.tools.util.StringOps.splitWhere import Jar.isJarOrZip import File.pathSeparator +import java.net.MalformedURLException /** <p> * This module provides star expansion of '-classpath' option arguments, behaves the same as @@ -110,11 +111,22 @@ object ClassPath { case dir => dir filter (_.isClassContainer) map (x => new java.io.File(dir.file, x.name) getPath) toList } } + /** Expand manifest jar classpath entries: these are either urls, or paths + * relative to the location of the jar. + */ + def expandManifestPath(jarPath: String): List[URL] = { + val file = File(jarPath) + if (!file.isFile) return Nil + + val baseDir = file.parent + new Jar(file).classPathElements map (elem => + specToURL(elem) getOrElse (baseDir / elem).toURL + ) + } /** A useful name filter. */ def isTraitImplementation(name: String) = name endsWith "$class.class" - import java.net.MalformedURLException def specToURL(spec: String): Option[URL] = try Some(new URL(spec)) catch { case _: MalformedURLException => None } |