aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Vogt <oss.nsp@cvogt.org>2017-02-13 08:25:31 -0500
committerChristopher Vogt <oss.nsp@cvogt.org>2017-02-13 08:25:31 -0500
commit4561db0a58053ffebaf2830fbed13f5b9eb8fb1f (patch)
tree1ea304bd85bcb082800120fb182823c988a1de29
parent27fd0f346b901d8f86ff71d408c4b8cf16dc91f7 (diff)
downloadcbt-4561db0a58053ffebaf2830fbed13f5b9eb8fb1f.tar.gz
cbt-4561db0a58053ffebaf2830fbed13f5b9eb8fb1f.tar.bz2
cbt-4561db0a58053ffebaf2830fbed13f5b9eb8fb1f.zip
support for flat classloader and enhanced resources example
-rw-r--r--examples/resources-example/Main.scala22
-rw-r--r--examples/resources-example/build/build.scala21
-rw-r--r--examples/resources-example/parent/build/build.scala12
-rw-r--r--examples/resources-example/parent/build/build/build.scala (renamed from examples/resources-example/build/build/build.scala)0
-rw-r--r--examples/resources-example/parent/my-resources/foo.text (renamed from examples/resources-example/my-resources/foo.text)0
-rw-r--r--examples/resources-example/parent/package.scala6
-rw-r--r--examples/resources-example/parent/parent/package.scala6
-rw-r--r--examples/resources-example/parent/resources/foo.text (renamed from examples/resources-example/resources/foo.text)0
-rw-r--r--examples/resources-example/src/Main.scala27
-rw-r--r--plugins/essentials/DynamicOverrides.scala4
-rw-r--r--stage2/BasicBuild.scala25
-rw-r--r--test/test.scala12
12 files changed, 88 insertions, 47 deletions
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/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/build/build/build.scala b/examples/resources-example/parent/build/build/build.scala
index f700060..f700060 100644
--- a/examples/resources-example/build/build/build.scala
+++ b/examples/resources-example/parent/build/build/build.scala
diff --git a/examples/resources-example/my-resources/foo.text b/examples/resources-example/parent/my-resources/foo.text
index f82e417..f82e417 100644
--- a/examples/resources-example/my-resources/foo.text
+++ b/examples/resources-example/parent/my-resources/foo.text
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/resources/foo.text b/examples/resources-example/parent/resources/foo.text
index 6d7c85a..6d7c85a 100644
--- a/examples/resources-example/resources/foo.text
+++ b/examples/resources-example/parent/resources/foo.text
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)