From 4561db0a58053ffebaf2830fbed13f5b9eb8fb1f Mon Sep 17 00:00:00 2001 From: Christopher Vogt Date: Mon, 13 Feb 2017 08:25:31 -0500 Subject: support for flat classloader and enhanced resources example --- examples/resources-example/Main.scala | 22 ++++++++++++++++++ examples/resources-example/build/build.scala | 21 ++++------------- examples/resources-example/build/build/build.scala | 20 ---------------- examples/resources-example/my-resources/foo.text | 1 - .../resources-example/parent/build/build.scala | 12 ++++++++++ .../parent/build/build/build.scala | 20 ++++++++++++++++ .../resources-example/parent/my-resources/foo.text | 1 + examples/resources-example/parent/package.scala | 6 +++++ .../resources-example/parent/parent/package.scala | 6 +++++ .../resources-example/parent/resources/foo.text | 1 + examples/resources-example/resources/foo.text | 1 - examples/resources-example/src/Main.scala | 27 ---------------------- plugins/essentials/DynamicOverrides.scala | 4 ++++ stage2/BasicBuild.scala | 25 +++++++++++++++++--- test/test.scala | 12 ++++++++++ 15 files changed, 110 insertions(+), 69 deletions(-) create mode 100644 examples/resources-example/Main.scala delete mode 100644 examples/resources-example/build/build/build.scala delete mode 100644 examples/resources-example/my-resources/foo.text create mode 100644 examples/resources-example/parent/build/build.scala create mode 100644 examples/resources-example/parent/build/build/build.scala create mode 100644 examples/resources-example/parent/my-resources/foo.text create mode 100644 examples/resources-example/parent/package.scala create mode 100644 examples/resources-example/parent/parent/package.scala create mode 100644 examples/resources-example/parent/resources/foo.text delete mode 100644 examples/resources-example/resources/foo.text delete mode 100644 examples/resources-example/src/Main.scala diff --git a/examples/resources-example/Main.scala b/examples/resources-example/Main.scala new file mode 100644 index 0000000..f0c8e1b --- /dev/null +++ b/examples/resources-example/Main.scala @@ -0,0 +1,22 @@ +package cbt.example.resources +import scala.collection.JavaConverters._ +import java.nio.file.{Files, Paths} +object Main{ + def getResource = Option(getClass.getClassLoader.getResource("foo.text")) + def getResources = getClass.getClassLoader.getResources("foo.text").asScala.toList + + def main( args: Array[String] ): Unit = { + println("Reading parent's resources") + println("") + // resources are in the parent + println("via child: " + getResource.nonEmpty + " " + getResources.size ) + println("") + // this one is where the resources are + println("via parent: " + parent.getResource.nonEmpty + " " + parent.getResources.size ) + println("") + // parent is parent.parent's child. reading children's resources only works + // with a flat classloader in cbt. Try `override def flatClassLoader = true`. + // or `cbt runFlat` when extending `DynamicOverrides` + println("via parent.parent: " + parent.parent.getResource.nonEmpty + " " + parent.parent.getResources.size ) + } +} diff --git a/examples/resources-example/build/build.scala b/examples/resources-example/build/build.scala index aec5d79..b95863d 100644 --- a/examples/resources-example/build/build.scala +++ b/examples/resources-example/build/build.scala @@ -1,21 +1,8 @@ import cbt._ -class Build(val context: Context) extends BaseBuild{ - /* +class Build(val context: Context) extends DynamicOverrides{ override def dependencies = - super.dependencies ++ // don't forget super.dependencies here - Seq( - // source dependency - DirectoryDependency( projectDirectory ++ "/subProject" ) - ) ++ - Resolver( mavenCentral ).bind( - // CBT-style Scala dependencies - ScalaDependency( "com.lihaoyi", "ammonite-ops", "0.5.5" ) - MavenDependency( "com.lihaoyi", "ammonite-ops_2.11", "0.5.5" ) - - // SBT-style dependencies - "com.lihaoyi" %% "ammonite-ops" % "0.5.5" - "com.lihaoyi" % "ammonite-ops_2.11" % "0.5.5" + super.dependencies ++ // don't forget super.dependencies here for scala-library, etc. + Seq( + DirectoryDependency( projectDirectory ++ "/parent" ) ) - */ - override def resourceClasspath = super.resourceClasspath ++ ClassPath(Seq(projectDirectory ++ "/my-resources")) } diff --git a/examples/resources-example/build/build/build.scala b/examples/resources-example/build/build/build.scala deleted file mode 100644 index f700060..0000000 --- a/examples/resources-example/build/build/build.scala +++ /dev/null @@ -1,20 +0,0 @@ -import cbt._ -class Build(val context: Context) extends BuildBuild{ - /* - override def dependencies = - super.dependencies ++ // don't forget super.dependencies here - Seq( - // source dependency - DirectoryDependency( projectDirectory ++ "/subProject" ) - ) ++ - Resolver( mavenCentral ).bind( - // CBT-style Scala dependencies - ScalaDependency( "com.lihaoyi", "ammonite-ops", "0.5.5" ) - MavenDependency( "com.lihaoyi", "ammonite-ops_2.11", "0.5.5" ) - - // SBT-style dependencies - "com.lihaoyi" %% "ammonite-ops" % "0.5.5" - "com.lihaoyi" % "ammonite-ops_2.11" % "0.5.5" - ) - */ -} diff --git a/examples/resources-example/my-resources/foo.text b/examples/resources-example/my-resources/foo.text deleted file mode 100644 index f82e417..0000000 --- a/examples/resources-example/my-resources/foo.text +++ /dev/null @@ -1 +0,0 @@ -Hello from a resource in my-resources/ (the additional location manually added here in build.scala) diff --git a/examples/resources-example/parent/build/build.scala b/examples/resources-example/parent/build/build.scala new file mode 100644 index 0000000..f04ab40 --- /dev/null +++ b/examples/resources-example/parent/build/build.scala @@ -0,0 +1,12 @@ +import cbt._ +class Build(val context: Context) extends BaseBuild{ + override def dependencies = + super.dependencies ++ // don't forget super.dependencies here + Seq( + DirectoryDependency( projectDirectory ++ "/parent" ) + ) + + override def resourceClasspath = super.resourceClasspath ++ ClassPath( + Seq(projectDirectory ++ "/my-resources") + ) +} diff --git a/examples/resources-example/parent/build/build/build.scala b/examples/resources-example/parent/build/build/build.scala new file mode 100644 index 0000000..f700060 --- /dev/null +++ b/examples/resources-example/parent/build/build/build.scala @@ -0,0 +1,20 @@ +import cbt._ +class Build(val context: Context) extends BuildBuild{ + /* + override def dependencies = + super.dependencies ++ // don't forget super.dependencies here + Seq( + // source dependency + DirectoryDependency( projectDirectory ++ "/subProject" ) + ) ++ + Resolver( mavenCentral ).bind( + // CBT-style Scala dependencies + ScalaDependency( "com.lihaoyi", "ammonite-ops", "0.5.5" ) + MavenDependency( "com.lihaoyi", "ammonite-ops_2.11", "0.5.5" ) + + // SBT-style dependencies + "com.lihaoyi" %% "ammonite-ops" % "0.5.5" + "com.lihaoyi" % "ammonite-ops_2.11" % "0.5.5" + ) + */ +} diff --git a/examples/resources-example/parent/my-resources/foo.text b/examples/resources-example/parent/my-resources/foo.text new file mode 100644 index 0000000..f82e417 --- /dev/null +++ b/examples/resources-example/parent/my-resources/foo.text @@ -0,0 +1 @@ +Hello from a resource in my-resources/ (the additional location manually added here in build.scala) diff --git a/examples/resources-example/parent/package.scala b/examples/resources-example/parent/package.scala new file mode 100644 index 0000000..cbd4d8f --- /dev/null +++ b/examples/resources-example/parent/package.scala @@ -0,0 +1,6 @@ +package cbt.example.resources.parent +import scala.collection.JavaConverters._ +object `package`{ + def getResource = Option(getClass.getClassLoader.getResource("foo.text")) + def getResources = getClass.getClassLoader.getResources("foo.text").asScala.toList +} diff --git a/examples/resources-example/parent/parent/package.scala b/examples/resources-example/parent/parent/package.scala new file mode 100644 index 0000000..8d40851 --- /dev/null +++ b/examples/resources-example/parent/parent/package.scala @@ -0,0 +1,6 @@ +package cbt.example.resources.parent.parent +import scala.collection.JavaConverters._ +object `package`{ + def getResource = Option(getClass.getClassLoader.getResource("foo.text")) + def getResources = getClass.getClassLoader.getResources("foo.text").asScala.toList +} diff --git a/examples/resources-example/parent/resources/foo.text b/examples/resources-example/parent/resources/foo.text new file mode 100644 index 0000000..6d7c85a --- /dev/null +++ b/examples/resources-example/parent/resources/foo.text @@ -0,0 +1 @@ +Hello from a resource in resources/ (the default location) diff --git a/examples/resources-example/resources/foo.text b/examples/resources-example/resources/foo.text deleted file mode 100644 index 6d7c85a..0000000 --- a/examples/resources-example/resources/foo.text +++ /dev/null @@ -1 +0,0 @@ -Hello from a resource in resources/ (the default location) diff --git a/examples/resources-example/src/Main.scala b/examples/resources-example/src/Main.scala deleted file mode 100644 index 3bc0943..0000000 --- a/examples/resources-example/src/Main.scala +++ /dev/null @@ -1,27 +0,0 @@ -import java.nio.file.{Files, Paths} -object Main extends App { - // Be aware that CBT currently isolates classloaders of dependencies - // your dependencies will not see the resources of your project - // This means that e.g. spray will not see a application.conf in your project's - // resources/ directory. See https://github.com/cvogt/cbt/issues/176 - println( - "foo.text in resources contains: " ++ - new String( - Files.readAllBytes( - Paths.get( getClass.getClassLoader.getResource("foo.text").getFile ) - ) - ) - ) - import scala.collection.JavaConverters._ - println( - "foo.text in resources and my-resources:\n" ++ - getClass.getClassLoader.getResources("foo.text").asScala.map( - resource => - new String( - Files.readAllBytes( - Paths.get( resource.getFile ) - ) - ) - ).mkString - ) -} diff --git a/plugins/essentials/DynamicOverrides.scala b/plugins/essentials/DynamicOverrides.scala index 1050f98..274cdd1 100644 --- a/plugins/essentials/DynamicOverrides.scala +++ b/plugins/essentials/DynamicOverrides.scala @@ -73,4 +73,8 @@ trait DynamicOverrides extends BaseBuild{ createBuild( context ).asInstanceOf[T] } } + + def runFlat: ExitCode = newBuild[DynamicOverrides]{""" + override def flatClassLoader = true + """}.run } diff --git a/stage2/BasicBuild.scala b/stage2/BasicBuild.scala index 750b0bc..9db4632 100644 --- a/stage2/BasicBuild.scala +++ b/stage2/BasicBuild.scala @@ -157,9 +157,28 @@ trait BaseBuild extends BuildInterface with DependencyImplementation with Trigge def runClass: Option[String] = lib.runClass( mainClasses ).map( _.getName ) - def run: ExitCode = runClass.map( lib.runMain( _, context.args, classLoader(context.classLoaderCache) ) ).getOrElse{ - logger.task( "No main class found for " ++ projectDirectory.string ) - ExitCode.Success + def runMain( className: String, args: String* ) = lib.runMain( className, args, classLoader(context.classLoaderCache) ) + + def flatClassLoader: Boolean = false + + def run: ExitCode = { + if(flatClassLoader){ + runClass.map( + lib.runMain( + _, + context.args, + new java.net.URLClassLoader(classpath.strings.map(f => new URL("file://" ++ f)).toArray) + ) + ).getOrElse{ + logger.task( "No main class found for " ++ projectDirectory.string ) + ExitCode.Success + } + } else { + runClass.map( runMain( _, context.args: _* ) ).getOrElse{ + logger.task( "No main class found for " ++ projectDirectory.string ) + ExitCode.Success + } + } } def clean: ExitCode = { diff --git a/test/test.scala b/test/test.scala index e9da8bf..ecc44ca 100644 --- a/test/test.scala +++ b/test/test.scala @@ -327,6 +327,18 @@ object Main{ assert(res.out.contains("All tests passed"), res.out) } + { + val res = runCbt("../examples/resources-example", Seq("run")) + assert(res.exit0) + assert(res.out.contains("via parent.parent: false 0"), res.out) + } + + { + val res = runCbt("../examples/resources-example", Seq("runFlat")) + assert(res.exit0) + assert(res.out.contains("via parent.parent: true 2"), res.out) + } + System.err.println(" DONE!") System.err.println( successes.toString ++ " succeeded, "++ failures.toString ++ " failed" ) if(failures > 0) System.exit(1) else System.exit(0) -- cgit v1.2.3