Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why sbt compile doesn't copy unmanaged resources to classpath?

Could you tell me why sbt compile doesn't copy unmanaged resources to classpath? On the other hand sbt package does. As result I can't start debugging unless I invoke package call manually :(

I'm using SBT 0.12.1

Below is my build.sbt.

import AssemblyKeys._ // put this at the top of the file

net.virtualvoid.sbt.graph.Plugin.graphSettings

assemblySettings

organization  := "com.zzz"

version       := "0.1"

scalaVersion  := "2.10.2"

scalacOptions := Seq("-unchecked", "-language:reflectiveCalls,postfixOps,implicitConversions", "-deprecation", "-feature", "-encoding", "utf8")

unmanagedResourceDirectories in Compile <++= baseDirectory { base =>
    Seq( base / "src/main/webapp" )
}

jarName in assembly := "zzz.jar"

mergeStrategy in assembly <<= (mergeStrategy in assembly) { (old) =>
    {
        case "rootdoc.txt" => MergeStrategy.discard
        case x => old(x)
    }
}

mainClass in assembly := Some("com.zzz.Boot")

name := "zzz"

// disable using the Scala version in output paths and artifacts
crossPaths := false

artifactName := { (sv: ScalaVersion, module: ModuleID, artifact: Artifact) =>
  artifact.name + "." + artifact.extension
}

resolvers ++= Seq(
  "spray repo" at "http://repo.spray.io/"
)

libraryDependencies ++= {
  val sprayVersion = "1.2-M8"
  val akkaVersion  = "2.2.0-RC1"
Seq(
  "io.spray"            %   "spray-servlet" % sprayVersion withSources(),
  "io.spray"            %   "spray-can"     % sprayVersion withSources(),
  "io.spray"            %   "spray-routing" % sprayVersion withSources(),
  "com.typesafe.akka"   %%  "akka-actor"    % akkaVersion,
  "org.eclipse.jetty"       %   "jetty-webapp"  % "8.1.7.v20120910"     % "container",
  "org.eclipse.jetty.orbit" %   "javax.servlet" % "3.0.0.v201112011016" % "container"  artifacts Artifact("javax.servlet", "jar", "jar"),
  "net.sourceforge.htmlcleaner" % "htmlcleaner" % "2.2",
  "org.apache.httpcomponents" % "httpclient" % "4.2.3",
  "org.apache.commons" % "commons-lang3" % "3.1",
  "org.mongodb" %% "casbah" % "2.6.0",
  "com.romix.scala" % "scala-kryo-serialization" % "0.2-SNAPSHOT",
  "org.codehaus.jettison" % "jettison" % "1.3.3",
  "com.osinka.subset" %% "subset" % "2.0.1",
  "io.spray" %% "spray-json" % "1.2.5" intransitive()
)
}

seq(Revolver.settings: _*)

seq(webSettings: _*)

seq(Twirl.settings: _*)
like image 602
expert Avatar asked Jul 10 '13 09:07

expert


1 Answers

The job of compile is to compile sources, so it won't typically do anything related to processing resources. However, the resources need to be in the class directory for run, package, test, console, and anything else that uses the fullClasspath. This is done by fullClasspath combining exportedProducts, which are the classes and resources generated by the current project, and dependencyClasspath, which are the classpath entries from dependencies.

The appropriate solution depends on what needs the resources. From the command line, run exported-products to do a compile as well as copy-resources. Programmatically, you will typically want to depend on fullClasspath or exportedProducts.

As a side note, you can typically find out what tasks do what using the inspect command.

like image 62
Mark Harrah Avatar answered Nov 16 '22 01:11

Mark Harrah