import sbt._ import Keys._ import play.Project._ object ApplicationBuild extends Build { val appName = "proinfodata-web" val appVersion = "2.0.4" val appDependencies = Seq( javaCore, javaJdbc, "postgresql" % "postgresql" % "9.1-901-1.jdbc4", "net.sf.jasperreports" % "jasperreports" % "5.0.4", "commons-digester" % "commons-digester" % "2.1", "groovy" % "groovy-all" % "1.1-rc-1", "com.lowagie" % "itext" % "4.2.0" ) val fullDist = TaskKey[File]("dist", "Build the standalone application package with reports in it") val fullDistTask = (distDirectory, baseDirectory, playPackageEverything, dependencyClasspath in Runtime, target, normalizedName, version) map { (dist, root, packaged, dependencies, target, id, version) => import sbt.NameFilter._ val packageName = id + "-" + version val zip = dist / (packageName + ".zip") IO.delete(dist) IO.createDirectory(dist) val libs = { dependencies.filter(_.data.ext == "jar").map { dependency => val filename = for { module <- dependency.metadata.get(AttributeKey[ModuleID]("module-id")) artifact <- dependency.metadata.get(AttributeKey[Artifact]("artifact")) } yield { module.organization + "." + module.name + "-" + Option(artifact.name.replace(module.name, "")).filterNot(_.isEmpty).map(_ + "-").getOrElse("") + module.revision + ".jar" } val path = ("lib/" + filename.getOrElse(dependency.data.getName)) dependency.data -> path } ++ packaged.map(jar => jar -> ("lib/" + jar.getName)) } val start = target / "start" val customConfig = Option(System.getProperty("config.file")) val customFileName = customConfig.map(f => Some((new File(f)).getName)).getOrElse(None) IO.write(start, """#!/usr/bin/env sh scriptdir=`dirname $0` classpath=""" + libs.map { case (jar, path) => "$scriptdir/" + path }.mkString("\"", ":", "\"") + """ exec java $* -cp $classpath """ + customFileName.map(fn => "-Dconfig.file=`dirname $0`/" + fn + " ").getOrElse("") + """play.core.server.NettyServer `dirname $0` """ /* */ ) val scripts = Seq(start -> (packageName + "/start")) val other = Seq((root / "README") -> (packageName + "/README")) val reportsDir = (root / "reports/") val reports = reportsDir.listFiles.map { file => file -> (packageName + "/reports/" + file.getName) } val reportImagesDir = (root / "reports/images/") val reportImages = reportImagesDir.listFiles.map { file => file -> (packageName + "/reports/images/" + file.getName) } val productionConfig = customFileName.map(fn => target / fn).getOrElse(target / "application.conf") val prodApplicationConf = customConfig.map { location => val customConfigFile = new File(location) IO.copyFile(customConfigFile, productionConfig) Seq(productionConfig -> (packageName + "/" + customConfigFile.getName)) }.getOrElse(Nil) IO.zip(libs.map { case (jar, path) => jar -> (packageName + "/" + path) } ++ scripts ++ reports ++ reportImages ++ other ++ prodApplicationConf, zip) IO.delete(start) IO.delete(productionConfig) println() println("Your application is ready in " + zip.getCanonicalPath) println() zip } val main = play.Project(appName, appVersion, appDependencies).settings( fullDist <<= fullDistTask ) }