aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--stage1/Stage1Lib.scala37
-rw-r--r--stage2/BasicBuild.scala7
2 files changed, 43 insertions, 1 deletions
diff --git a/stage1/Stage1Lib.scala b/stage1/Stage1Lib.scala
index c427b77..3a1fe45 100644
--- a/stage1/Stage1Lib.scala
+++ b/stage1/Stage1Lib.scala
@@ -118,6 +118,43 @@ class Stage1Lib( val logger: Logger ) extends BaseLib{
}
}
+ def mainClasses(compileTarget : File, classLoader : ClassLoader): Seq[String] = {
+ val targetLength = compileTarget.toString.length + 1 // compile target and slash
+
+ def className(file : File) : String = {
+ file.toString.dropRight(".class".length).drop(targetLength).replace(File.separator, ".")
+ }
+
+ /* for packaged applications */
+ def retrieveFiles(file: File): Seq[File] = {
+ file.listFiles.toSeq.map(currFile => {
+ if (currFile.isDirectory) retrieveFiles(currFile)
+ else Seq(currFile)
+ }
+ ).flatten
+ }
+
+ def classesWithMain(target : File, classLoader : ClassLoader): Seq[File] = {
+ def hasMainClass(file : File) : Boolean = {
+ val name = className(file)
+ val inspectClass = classLoader.loadClass(name)
+ inspectClass.getDeclaredMethods().map(_.getName).contains("main")
+ }
+
+ // FIXME: Check if argument list has exactly one element of type Array[String]
+ def isInnerClass(file : File) : Boolean = file.toString.contains("$")
+ val files = retrieveFiles(target)
+
+ val classFiles = files.filter(file => file.toString.endsWith(".class") && !isInnerClass(file)).toSeq
+
+ classFiles.filter(hasMainClass(_))
+ }
+
+ val hasMain = classesWithMain(compileTarget, classLoader)
+
+ hasMain.map(className(_))
+ }
+
implicit class ClassLoaderExtensions(classLoader: ClassLoader){
def canLoad(className: String) = {
try{
diff --git a/stage2/BasicBuild.scala b/stage2/BasicBuild.scala
index bcc3646..baa6d26 100644
--- a/stage2/BasicBuild.scala
+++ b/stage2/BasicBuild.scala
@@ -136,7 +136,12 @@ trait BaseBuild extends DependencyImplementation with BuildInterface with Trigge
)
}
- def runClass: String = "Main"
+ def runClass: String = lib.mainClasses ( compileTarget, classLoader(context.classLoaderCache) ) match {
+ case f if f.length == 1 => f.head
+ case f if f.length > 2 => System.err.println( " Multiple main classes defined in project." ); "None"
+ case _ => "Main"
+ }
+
def run: ExitCode = lib.runMainIfFound( runClass, context.args, classLoader(context.classLoaderCache) )
def clean = {