|
Play Framework/Scala example source code file (Build.scala)
The Build.scala Play Framework example source code/* * Copyright (C) 2009-2013 Typesafe Inc. <http://www.typesafe.com> */ import sbt._ import Keys._ import com.typesafe.tools.mima.plugin.MimaPlugin.mimaDefaultSettings import com.typesafe.tools.mima.plugin.MimaKeys.{previousArtifact, binaryIssueFilters} import com.typesafe.tools.mima.core._ import com.typesafe.sbt.SbtScalariform.defaultScalariformSettings import scala.util.Properties.isJavaAtLeast import play.twirl.sbt.SbtTwirl import play.twirl.sbt.Import.TwirlKeys object BuildSettings { import Resolvers._ def propOr(name: String, value: String): String = (sys.props get name) orElse (sys.env get name) getOrElse value def boolProp(name: String, default: Boolean = false): Boolean = (sys.props get name) orElse (sys.env get name) filter (x => x == "true" || x == "") map (_ => true) getOrElse default val experimental = Option(System.getProperty("experimental")).exists(_ == "true") val buildOrganization = "com.typesafe.play" val buildVersion = propOr("play.version", "2.4-SNAPSHOT") val buildWithDoc = boolProp("generate.doc") val previousVersion = "2.1.0" // Libraries that are not Scala libraries or are SBT libraries should not be published if the binary // version doesn't match this. val publishForScalaBinaryVersion = "2.10" val defaultScalaVersion = "2.10.4" val buildScalaVersion = propOr("scala.version", defaultScalaVersion) // TODO - Try to compute this from SBT... or not. val buildScalaVersionForSbt = propOr("play.sbt.scala.version", defaultScalaVersion) val buildScalaBinaryVersionForSbt = CrossVersion.binaryScalaVersion(buildScalaVersionForSbt) val buildSbtVersion = propOr("play.sbt.version", "0.13.5") val buildSbtMajorVersion = "0.13" val buildSbtVersionBinaryCompatible = CrossVersion.binarySbtVersion(buildSbtVersion) // Used by api docs generation to link back to the correct branch on GitHub, only when version is a SNAPSHOT val sourceCodeBranch = propOr("git.branch", "master") val publishNonCoreScalaLibraries = publishForScalaBinaryVersion == CrossVersion.binaryScalaVersion(buildScalaVersion) lazy val PerformanceTest = config("pt") extend(Test) val playCommonSettings = Seq( organization := buildOrganization, version := buildVersion, scalaVersion := buildScalaVersion, scalaBinaryVersion := CrossVersion.binaryScalaVersion(buildScalaVersion), ivyLoggingLevel := UpdateLogging.DownloadOnly, javacOptions ++= makeJavacOptions("1.6"), javacOptions in doc := Seq("-source", "1.6"), resolvers ++= playResolvers, fork in Test := true, testListeners in (Test,test) := Nil, javacOptions in Test := { if (isJavaAtLeast("1.8")) makeJavacOptions("1.8") else makeJavacOptions("1.6") }, unmanagedSourceDirectories in Test ++= { if (isJavaAtLeast("1.8")) Seq((sourceDirectory in Test).value / "java8") else Nil }, testOptions += Tests.Argument(TestFrameworks.JUnit, "-v"), testOptions in Test += Tests.Filter(!_.endsWith("Benchmark")), testOptions in PerformanceTest ~= (_.filterNot(_.isInstanceOf[Tests.Filter]) :+ Tests.Filter(_.endsWith("Benchmark"))), parallelExecution in PerformanceTest := false ) def makeJavacOptions(version: String) = Seq("-source", version, "-target", version, "-encoding", "UTF-8", "-Xlint:-options") val dontPublishSettings = Seq( /** * We actually must publish when doing a publish-local in order to ensure the scala 2.11 build works, very strange * things happen if you set publishArtifact := false, since it still publishes an ivy file when you do a * publish-local, but that ivy file says there's no artifacts. * * So, to disable publishing for the 2.11 build, we simply publish to a dummy repo instead of to the real thing. */ publishTo := Some(Resolver.file("Unused transient repository", file("target/unusedrepo"))) ) val publishSettings = Seq( publishArtifact in packageDoc := buildWithDoc, publishArtifact in (Compile, packageSrc) := true, publishTo := Some(publishingMavenRepository) ) def PlaySharedJavaProject(name: String, dir: String, testBinaryCompatibility: Boolean = false): Project = { val bcSettings: Seq[Setting[_]] = if (testBinaryCompatibility) { mimaDefaultSettings ++ Seq(previousArtifact := Some(buildOrganization % Project.normalizeModuleID(name) % previousVersion)) } else Nil Project(name, file("src/" + dir)) .configs(PerformanceTest) .settings(inConfig(PerformanceTest)(Defaults.testTasks) : _*) .settings(playCommonSettings: _*) .settings((if (publishNonCoreScalaLibraries) publishSettings else dontPublishSettings): _*) .settings(bcSettings: _*) .settings( scalaVersion := defaultScalaVersion, scalaBinaryVersion := CrossVersion.binaryScalaVersion(defaultScalaVersion), autoScalaLibrary := false, crossPaths := false ) } def PlayRuntimeProject(name: String, dir: String): Project = { Project(name, file("src/" + dir)) .configs(PerformanceTest) .settings(inConfig(PerformanceTest)(Defaults.testTasks) : _*) .settings(playCommonSettings: _*) .settings(publishSettings: _*) .settings(mimaDefaultSettings: _*) .settings(defaultScalariformSettings: _*) .settings(playRuntimeSettings(name): _*) } def playRuntimeSettings(name: String): Seq[Setting[_]] = Seq( previousArtifact := Some(buildOrganization % (Project.normalizeModuleID(name) + "_" + CrossVersion.binaryScalaVersion(buildScalaVersion)) % previousVersion), scalacOptions ++= Seq("-encoding", "UTF-8", "-Xlint", "-deprecation", "-unchecked", "-feature"), Docs.apiDocsInclude := true ) def PlaySbtProject(name: String, dir: String): Project = { Project(name, file("src/" + dir)) .settings(playCommonSettings: _*) .settings((if (publishNonCoreScalaLibraries) publishSettings else dontPublishSettings): _*) .settings(defaultScalariformSettings: _*) .settings( scalaVersion := buildScalaVersionForSbt, scalaBinaryVersion := CrossVersion.binaryScalaVersion(buildScalaVersionForSbt), scalacOptions ++= Seq("-encoding", "UTF-8", "-Xlint", "-deprecation", "-unchecked")) } /** * Adds a set of Scala 2.11 modules to the build. * * Only adds if Scala version is >= 2.11. */ def addScalaModules(modules: ModuleID*): Setting[_] = { libraryDependencies := { CrossVersion.partialVersion(scalaVersion.value) match { case Some((2, scalaMajor)) if scalaMajor >= 11 => libraryDependencies.value ++ modules case _ => libraryDependencies.value } } } val scalaParserCombinators = "org.scala-lang.modules" %% "scala-parser-combinators" % "1.0.1" } object Resolvers { import BuildSettings._ val typesafeReleases = "Typesafe Releases Repository" at "http://repo.typesafe.com/typesafe/releases/" val typesafeSnapshots = "Typesafe Snapshots Repository" at "http://repo.typesafe.com/typesafe/snapshots/" val typesafeIvyReleases = Resolver.url("Typesafe Ivy Releases Repository", url("http://repo.typesafe.com/typesafe/ivy-releases"))(Resolver.ivyStylePatterns) val typesafeIvySnapshots = Resolver.url("Typesafe Ivy Snapshots Repository", url("http://repo.typesafe.com/typesafe/ivy-snapshots"))(Resolver.ivyStylePatterns) val publishTypesafeMavenReleases = "Typesafe Maven Releases Repository for publishing" at "https://private-repo.typesafe.com/typesafe/maven-releases/" val publishTypesafeMavenSnapshots = "Typesafe Maven Snapshots Repository for publishing" at "https://private-repo.typesafe.com/typesafe/maven-snapshots/" val publishTypesafeIvyReleases = Resolver.url("Typesafe Ivy Releases Repository for publishing", url("https://private-repo.typesafe.com/typesafe/ivy-releases/"))(Resolver.ivyStylePatterns) val publishTypesafeIvySnapshots = Resolver.url("Typesafe Ivy Snapshots Repository for publishing", url("https://private-repo.typesafe.com/typesafe/ivy-snapshots/"))(Resolver.ivyStylePatterns) val sonatypeSnapshots = "Sonatype snapshots" at "http://oss.sonatype.org/content/repositories/snapshots/" val sbtPluginSnapshots = Resolver.url("sbt plugin snapshots", url("http://repo.scala-sbt.org/scalasbt/sbt-plugin-snapshots"))(Resolver.ivyStylePatterns) val isSnapshotBuild = buildVersion.endsWith("SNAPSHOT") val playResolvers = Seq(typesafeReleases, typesafeIvyReleases) val publishingMavenRepository = if (isSnapshotBuild) publishTypesafeMavenSnapshots else publishTypesafeMavenReleases val publishingIvyRepository = if (isSnapshotBuild) publishTypesafeIvySnapshots else publishTypesafeIvyReleases } object PlayBuild extends Build { import Resolvers._ import Dependencies._ import BuildSettings._ import Generators._ import Tasks._ lazy val BuildLinkProject = PlaySharedJavaProject("Build-Link", "build-link") .settings(libraryDependencies ++= link) .dependsOn(PlayExceptionsProject) lazy val RoutesCompilerProject = PlaySbtProject("Routes-Compiler", "routes-compiler") .settings(libraryDependencies ++= routersCompilerDependencies) lazy val AnormProject = PlayRuntimeProject("Anorm", "anorm") .settings( libraryDependencies ++= anormDependencies, resolvers += sonatypeSnapshots, addScalaModules(scalaParserCombinators) ) lazy val IterateesProject = PlayRuntimeProject("Play-Iteratees", "iteratees") .settings(libraryDependencies ++= iterateesDependencies) lazy val FunctionalProject = PlayRuntimeProject("Play-Functional", "play-functional") lazy val DataCommonsProject = PlayRuntimeProject("Play-DataCommons", "play-datacommons") lazy val JsonProject = PlayRuntimeProject("Play-Json", "play-json") .settings(libraryDependencies ++= jsonDependencies) .dependsOn(IterateesProject, FunctionalProject, DataCommonsProject) lazy val PlayExceptionsProject = PlaySharedJavaProject("Play-Exceptions", "play-exceptions", testBinaryCompatibility = true) lazy val PlayNettyUtilsProject = PlaySharedJavaProject("Play-Netty-Utils", "play-netty-utils") lazy val PlayProject = PlayRuntimeProject("Play", "play") .enablePlugins(SbtTwirl) .settings( addScalaModules(scalaParserCombinators), libraryDependencies ++= runtime ++ scalacheckDependencies, sourceGenerators in Compile <+= sourceManaged in Compile map PlayVersion(buildScalaVersion), sourceDirectories in (Compile, TwirlKeys.compileTemplates) := (unmanagedSourceDirectories in Compile).value, TwirlKeys.templateImports += "play.api.templates.PlayMagic._", mappings in (Compile, packageSrc) <++= scalaTemplateSourceMappings, Docs.apiDocsIncludeManaged := true, parallelExecution in Test := false ).dependsOn( BuildLinkProject, IterateesProject % "test->test;compile->compile", JsonProject, PlayExceptionsProject, PlayNettyUtilsProject ) lazy val PlayServerProject = PlayRuntimeProject("Play-Server", "play-server") .settings(libraryDependencies ++= playServerDependencies) .dependsOn(PlayProject) lazy val PlayNettyServerProject = PlayRuntimeProject("Play-Netty-Server", "play-netty-server") .settings(libraryDependencies ++= netty) .dependsOn(PlayServerProject) lazy val PlayJdbcProject = PlayRuntimeProject("Play-JDBC", "play-jdbc") .settings(libraryDependencies ++= jdbcDeps) .dependsOn(PlayProject).dependsOn(PlayTestProject % "test") lazy val PlayJavaJdbcProject = PlayRuntimeProject("Play-Java-JDBC", "play-java-jdbc").settings(libraryDependencies ++= javaJdbcDeps) .dependsOn(PlayJdbcProject, PlayJavaProject) .dependsOn(PlayTestProject % "test") lazy val PlayEbeanProject = PlayRuntimeProject("Play-Java-Ebean", "play-java-ebean") .settings( libraryDependencies ++= ebeanDeps ++ jpaDeps, compile in (Compile) <<= (dependencyClasspath in Compile, compile in Compile, classDirectory in Compile) map { (deps, analysis, classes) => // Ebean (really hacky sorry) val cp = deps.map(_.data.toURI.toURL).toArray :+ classes.toURI.toURL val cl = new java.net.URLClassLoader(cp) val t = cl.loadClass("com.avaje.ebean.enhance.agent.Transformer").getConstructor(classOf[Array[URL]], classOf[String]).newInstance(cp, "debug=0").asInstanceOf[AnyRef] val ft = cl.loadClass("com.avaje.ebean.enhance.ant.OfflineFileTransform").getConstructor( t.getClass, classOf[ClassLoader], classOf[String], classOf[String] ).newInstance(t, ClassLoader.getSystemClassLoader, classes.getAbsolutePath, classes.getAbsolutePath).asInstanceOf[AnyRef] ft.getClass.getDeclaredMethod("process", classOf[String]).invoke(ft, "play/db/ebean/**") analysis } ).dependsOn(PlayJavaJdbcProject) lazy val PlayJpaProject = PlayRuntimeProject("Play-Java-JPA", "play-java-jpa") .settings(libraryDependencies ++= jpaDeps) .dependsOn(PlayJavaJdbcProject) lazy val PlayTestProject = PlayRuntimeProject("Play-Test", "play-test") .settings( libraryDependencies ++= testDependencies, parallelExecution in Test := false ).dependsOn(PlayNettyServerProject) lazy val PlayJavaProject = PlayRuntimeProject("Play-Java", "play-java") .settings(libraryDependencies ++= javaDeps ++ javaTestDeps) .dependsOn(PlayProject % "compile;test->test") lazy val PlayDocsProject = PlayRuntimeProject("Play-Docs", "play-docs") .settings(Docs.settings: _*) .settings( libraryDependencies ++= playDocsDependencies ).dependsOn(PlayNettyServerProject) import ScriptedPlugin._ lazy val SbtPluginProject = PlaySbtProject("SBT-Plugin", "sbt-plugin") .settings( sbtPlugin := true, publishMavenStyle := false, libraryDependencies ++= sbtDependencies, sourceGenerators in Compile <+= sourceManaged in Compile map PlayVersion(buildScalaVersionForSbt), sbtVersion in GlobalScope := buildSbtVersion, sbtBinaryVersion in GlobalScope := buildSbtVersionBinaryCompatible, sbtDependency <<= sbtDependency { dep => dep.copy(revision = buildSbtVersion) }, TaskKey[Unit]("sbtdep") <<= allDependencies map { deps: Seq[ModuleID] => deps.map { d => d.organization + ":" + d.name + ":" + d.revision }.sorted.foreach(println) }, publishTo := Some(publishingIvyRepository), // Must be false, because due to the way SBT integrates with test libraries, and the way SBT uses Java object // serialisation to communicate with forked processes, and because this plugin will have SBT 0.13 on the forked // processes classpath while it's actually being run by SBT 0.12... if it forks you get serialVersionUID errors. fork in Test := false ).settings(scriptedSettings: _*) .settings( scriptedLaunchOpts ++= Seq( "-XX:MaxPermSize=384M", "-Dperformance.log=" + new File(baseDirectory.value, "target/sbt-repcomile-performance.properties"), "-Dproject.version=" + version.value ) ).dependsOn(BuildLinkProject, PlayExceptionsProject, RoutesCompilerProject) lazy val PlayWsProject = PlayRuntimeProject("Play-WS", "play-ws") .settings( libraryDependencies ++= playWsDeps, parallelExecution in Test := false ).dependsOn(PlayProject) .dependsOn(PlayTestProject % "test") lazy val PlayWsJavaProject = PlayRuntimeProject("Play-Java-WS", "play-java-ws") .settings( libraryDependencies ++= playWsDeps, parallelExecution in Test := false ).dependsOn(PlayProject) .dependsOn(PlayWsProject % "test->test;compile->compile", PlayJavaProject) lazy val PlayFiltersHelpersProject = PlayRuntimeProject("Filters-Helpers", "play-filters-helpers") .settings( parallelExecution in Test := false ).dependsOn(PlayProject, PlayTestProject % "test", PlayJavaProject % "test", PlayWsProject % "test") // This project is just for testing Play, not really a public artifact lazy val PlayIntegrationTestProject = PlayRuntimeProject("Play-Integration-Test", "play-integration-test") .settings( parallelExecution in Test := false, libraryDependencies ++= integrationTestDependencies, previousArtifact := None ) .dependsOn(PlayProject % "test->test", PlayWsProject, PlayWsJavaProject, PlayTestProject) .dependsOn(PlayFiltersHelpersProject) .dependsOn(PlayJavaProject) lazy val PlayCacheProject = PlayRuntimeProject("Play-Cache", "play-cache") .settings( libraryDependencies ++= playCacheDeps, parallelExecution in Test := false ).dependsOn(PlayProject) .dependsOn(PlayTestProject % "test") import RepositoryBuilder._ lazy val RepositoryProject = Project( "Play-Repository", file("repository")) .settings(dontPublishSettings:_*) .settings(localRepoCreationSettings:_*) .settings( localRepoProjectsPublished <<= (publishedProjects map (publishLocal in _)).dependOn, addProjectsToRepository(publishedProjects), localRepoArtifacts ++= Seq( "org.scala-lang" % "scala-compiler" % BuildSettings.buildScalaVersion % "master", "org.scala-lang" % "jline" % BuildSettings.buildScalaVersion % "master", "org.scala-lang" % "scala-compiler" % BuildSettings.buildScalaVersionForSbt % "master", "org.scala-lang" % "jline" % BuildSettings.buildScalaVersionForSbt % "master", "org.scala-sbt" % "sbt" % BuildSettings.buildSbtVersion, "org.fusesource.jansi" % "jansi" % "1.11" % "master" ) ) lazy val PlayDocsSbtPlugin = PlaySbtProject("Play-Docs-SBT-Plugin", "play-docs-sbt-plugin") .settings( sbtPlugin := true, publishMavenStyle := false, libraryDependencies ++= playDocsSbtPluginDependencies, sbtVersion in GlobalScope := buildSbtVersion, sbtBinaryVersion in GlobalScope := buildSbtVersionBinaryCompatible, sbtDependency <<= sbtDependency { dep => dep.copy(revision = buildSbtVersion) }, publishTo := Some(publishingIvyRepository), // Must be false, because due to the way SBT integrates with test libraries, and the way SBT uses Java object // serialisation to communicate with forked processes, and because this plugin will have SBT 0.13 on the forked // processes classpath while it's actually being run by SBT 0.12... if it forks you get serialVersionUID errors. fork in Test := false ).dependsOn(SbtPluginProject) lazy val publishedProjects = Seq[ProjectReference]( PlayProject, BuildLinkProject, AnormProject, IterateesProject, FunctionalProject, DataCommonsProject, JsonProject, RoutesCompilerProject, PlayCacheProject, PlayJdbcProject, PlayJavaProject, PlayJavaJdbcProject, PlayEbeanProject, PlayJpaProject, PlayNettyUtilsProject, PlayNettyServerProject, PlayServerProject, PlayWsProject, PlayWsJavaProject, SbtPluginProject, PlayTestProject, PlayExceptionsProject, PlayDocsProject, PlayFiltersHelpersProject, PlayIntegrationTestProject, PlayDocsSbtPlugin ) lazy val Root = Project( "Root", file(".")) .settings(playCommonSettings: _*) .settings(dontPublishSettings:_*) .settings( concurrentRestrictions in Global += Tags.limit(Tags.Test, 1), libraryDependencies ++= (runtime ++ jdbcDeps), Docs.apiDocsInclude := false, Docs.apiDocsIncludeManaged := false ) .aggregate(publishedProjects: _*) .aggregate(RepositoryProject) } Other Play Framework source code examplesHere is a short list of links related to this Play Framework Build.scala source code file: |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.