build.sbt (1,159 lines of code) (raw):
import scala.language.reflectiveCalls
Global / onChangedBuildSource := ReloadOnSourceChanges
Global / excludeLintKeys += scalacOptions
Global / concurrentRestrictions += Tags.limit(Tags.Test, 1)
// All Twitter library releases are date versioned as YY.MM.patch
val releaseVersion = "24.8.0-SNAPSHOT"
lazy val buildSettings = Seq(
version := releaseVersion,
scalaVersion := "2.13.6",
crossScalaVersions := Seq("2.12.12", "2.13.6"),
scalaModuleInfo := scalaModuleInfo.value.map(_.withOverrideScalaVersion(true)),
Test / fork := true, // We have to fork to get the JavaOptions
Test / javaOptions ++= travisTestJavaOptions,
libraryDependencies += scalaCollectionCompat
)
lazy val noPublishSettings = Seq(
publish / skip := true
)
def gcJavaOptions: Seq[String] = {
val javaVersion = System.getProperty("java.version")
if (javaVersion.startsWith("1.8")) {
jdk8GcJavaOptions
} else {
jdk11GcJavaOptions
}
}
def jdk8GcJavaOptions: Seq[String] = {
Seq(
"-XX:+UseParNewGC",
"-XX:+UseConcMarkSweepGC",
"-XX:+CMSParallelRemarkEnabled",
"-XX:+CMSClassUnloadingEnabled",
"-XX:ReservedCodeCacheSize=128m",
"-XX:SurvivorRatio=128",
"-XX:MaxTenuringThreshold=0",
"-Xss8M",
"-Xms512M",
"-Xmx2G"
)
}
def jdk11GcJavaOptions: Seq[String] = {
Seq(
"-XX:+UseConcMarkSweepGC",
"-XX:+CMSParallelRemarkEnabled",
"-XX:+CMSClassUnloadingEnabled",
"-XX:ReservedCodeCacheSize=128m",
"-XX:SurvivorRatio=128",
"-XX:MaxTenuringThreshold=0",
"-Xss8M",
"-Xms512M",
"-Xmx2G"
)
}
def travisTestJavaOptions: Seq[String] = {
// When building on travis-ci, we want to suppress logging to error level only.
// https://docs.travis-ci.com/user/environment-variables/#default-environment-variables
val travisBuild = sys.env.getOrElse("TRAVIS", "false").toBoolean
if (travisBuild) {
Seq(
"-DSKIP_FLAKY=true",
"-DSKIP_FLAKY_TRAVIS=true",
"-Dorg.slf4j.simpleLogger.defaultLogLevel=off",
"-Dcom.twitter.inject.test.logging.disabled",
// Needed to avoid cryptic EOFException crashes in forked tests
// in Travis with `sudo: false`.
// See https://github.com/sbt/sbt/issues/653
// and https://github.com/travis-ci/travis-ci/issues/3775
"-Xmx3G"
)
} else {
Seq("-DSKIP_FLAKY=true")
}
}
lazy val versions = new {
// When building on travis-ci, querying for the branch name via git commands
// will return "HEAD", because travis-ci checks out a specific sha.
val travisBranch = sys.env.getOrElse("TRAVIS_BRANCH", "")
// All Twitter library releases are date versioned as YY.MM.patch
val twLibVersion = releaseVersion
val commonsFileupload = "1.4"
val guice = "5.1.0"
val jackson = "2.14.3"
val jodaConvert = "2.2.3"
val jodaTime = "2.12.5"
val json4s = "4.0.3"
val junit = "4.12"
val libThrift = "0.10.0"
val logback = "1.2.11"
val mustache = "0.8.18"
val nscalaTime = "2.32.0"
val scalaCheck = "1.15.4"
val scalaGuice = "5.1.0"
val scalaTest = "3.1.2"
val scalaTestPlusJunit = "3.1.2.0"
val scalaTestPlusScalaCheck = "3.1.2.0"
val servletApi = "2.5"
val slf4j = "1.7.30"
val javaxBind = "2.3.0"
val javaxActivation = "1.1.1"
}
lazy val scalaCollectionCompat = "org.scala-lang.modules" %% "scala-collection-compat" % "2.1.2"
lazy val scalaCompilerOptions = scalacOptions ++= Seq(
"-deprecation",
"-encoding",
"UTF-8",
"-feature",
"-language:existentials",
"-language:higherKinds",
"-language:implicitConversions",
"-unchecked",
"-Ywarn-dead-code",
"-Ywarn-numeric-widen",
"-Xlint",
"-Ywarn-unused:imports"
)
lazy val testDependenciesSettings = Seq(
libraryDependencies ++= Seq(
"junit" % "junit" % versions.junit, // used by Java tests & org.junit.runner.RunWith annotation on c.t.inject.Test
"org.scalacheck" %% "scalacheck" % versions.scalaCheck % Test,
"org.scalatest" %% "scalatest" % versions.scalaTest % Test,
"org.scalatestplus" %% "junit-4-12" % versions.scalaTestPlusJunit % Test,
"org.scalatestplus" %% "scalacheck-1-14" % versions.scalaTestPlusScalaCheck % Test
)
)
lazy val baseSettings = Seq(
resolvers ++= Seq(
Resolver.sonatypeRepo("releases"),
Resolver.sonatypeRepo("snapshots")
),
scalaCompilerOptions,
Compile / compile / javacOptions ++= Seq("-source", "1.8", "-target", "1.8", "-Xlint:unchecked"),
doc / javacOptions ++= Seq("-source", "1.8"),
javaOptions ++= Seq(
"-Djava.net.preferIPv4Stack=true",
"-XX:+AggressiveOpts",
"-server"
),
javaOptions ++= gcJavaOptions,
// -a: print stack traces for failing asserts
testOptions += Tests.Argument(TestFrameworks.JUnit, "-a", "-v"),
// broken in 2.12 due to: https://issues.scala-lang.org/browse/SI-10134
Compile / doc / scalacOptions ++= {
if (scalaVersion.value.startsWith("2.12")) Seq("-no-java-comments")
else Nil
}
)
lazy val publishSettings = Seq(
publishMavenStyle := true,
publishConfiguration := publishConfiguration.value.withOverwrite(true),
publishLocalConfiguration := publishLocalConfiguration.value.withOverwrite(true),
Compile / publishArtifact := true,
Test / publishArtifact := false,
pomIncludeRepository := { _ => false },
publishTo := {
val nexus = "https://oss.sonatype.org/"
if (isSnapshot.value)
Some("snapshots" at nexus + "content/repositories/snapshots")
else
Some("releases" at nexus + "service/local/staging/deploy/maven2")
},
licenses := Seq("Apache 2.0" -> url("https://www.apache.org/licenses/LICENSE-2.0")),
homepage := Some(url("https://github.com/twitter/finatra")),
autoAPIMappings := true,
apiURL := Some(url("https://twitter.github.io/finatra/scaladocs/")),
Compile / managedSources / excludeFilter := HiddenFileFilter || "BUILD.bazel",
Compile / unmanagedSources / excludeFilter := HiddenFileFilter || "BUILD.bazel",
Compile / managedResources / excludeFilter := HiddenFileFilter || "BUILD.bazel",
Compile / unmanagedResources / excludeFilter := HiddenFileFilter || "BUILD.bazel",
pomExtra :=
<scm>
<url>git://github.com/twitter/finatra.git</url>
<connection>scm:git://github.com/twitter/finatra.git</connection>
</scm>
<developers>
<developer>
<id>twitter</id>
<name>Twitter Inc.</name>
<url>https://www.twitter.com/</url>
</developer>
</developers>,
Compile / resourceGenerators += Def.task {
val dir = (Compile / resourceManaged).value
val file = dir / "com" / "twitter" / name.value / "build.properties"
val buildRev = scala.sys.process.Process("git" :: "rev-parse" :: "HEAD" :: Nil).!!.trim
val buildName = new java.text.SimpleDateFormat("yyyyMMdd-HHmmss").format(new java.util.Date)
val contents =
s"name=${name.value}\nversion=${version.value}\nbuild_revision=$buildRev\nbuild_name=$buildName"
IO.write(file, contents)
Seq(file)
}.taskValue
)
lazy val projectSettingNoTestDependencies = baseSettings ++ buildSettings ++ publishSettings ++ Seq(
organization := "com.twitter"
)
lazy val projectSettings = projectSettingNoTestDependencies ++ testDependenciesSettings
lazy val baseServerSettings = baseSettings ++ buildSettings ++ publishSettings ++ Seq(
organization := "com.twitter",
publishArtifact := false,
publishLocal := {},
publish := {},
assembly / assemblyMergeStrategy := {
case "BUILD.bazel" => MergeStrategy.discard
case "META-INF/io.netty.versions.properties" => MergeStrategy.last
case PathList(ps @ _*) if ps.last endsWith ".class" => MergeStrategy.first
case other => MergeStrategy.defaultMergeStrategy(other)
}
)
lazy val exampleServerSettings = baseServerSettings ++ Seq(
run / fork := true,
Test / javaOptions ++= Seq(
// we are unable to guarantee that Logback will not get picked up b/c of coursier caching
// so we set the Logback System properties in addition to the slf4j-simple and the
// the Framework test logging disabled property.
"-Dlog.service.output=/dev/stdout",
"-Dlog.access.output=/dev/stdout",
"-Dlog_level=OFF",
"-Dorg.slf4j.simpleLogger.defaultLogLevel=off",
"-Dcom.twitter.inject.test.logging.disabled"
),
libraryDependencies ++= Seq(
"com.twitter" %% "twitter-server-logback-classic" % versions.twLibVersion,
"ch.qos.logback" % "logback-classic" % versions.logback
),
excludeDependencies ++= Seq(
// commons-logging is replaced by jcl-over-slf4j
ExclusionRule(organization = "commons-logging", name = "commons-logging")
)
)
lazy val finatraModules = Seq[sbt.ProjectReference](
benchmarks,
httpAnnotations,
httpClient,
httpCore,
httpMustache,
httpServer,
injectApp,
injectCore,
injectDtab,
injectLogback,
injectMdc,
injectModules,
injectPorts,
injectRequestScope,
injectServer,
injectSlf4j,
injectStack,
injectThrift,
injectThriftClient,
injectThriftClientHttpMapper,
injectUtils,
jackson,
mustache,
thrift,
utils,
validation
)
lazy val finatraExamples =
// START EXAMPLES
Seq[sbt.ProjectReference](
benchmark,
javaInjectableApp,
scalaInjectableApp,
javaInjectableTwitterServer,
scalaInjectableTwitterServer,
javaHttpServer,
scalaHttpServer,
thriftIdl,
javaThriftServer,
scalaThriftServer,
streamingExample,
twitterClone,
exampleWebDashboard
) ++
// END EXAMPLES
Seq.empty
def aggregatedProjects = finatraModules ++ finatraExamples
def mappingContainsAnyPath(mapping: (File, String), paths: Seq[String]): Boolean = {
paths.foldLeft(false)(_ || mapping._1.getPath.contains(_))
}
lazy val root = (project in file("."))
.enablePlugins(ScalaUnidocPlugin)
.settings(baseSettings)
.settings(buildSettings)
.settings(noPublishSettings)
.settings(
organization := "com.twitter",
moduleName := "finatra-root",
ScalaUnidoc / unidoc / unidocProjectFilter := inAnyProject
-- inProjects(benchmarks)
// START EXAMPLES
-- inProjects(
benchmark,
javaInjectableApp,
scalaInjectableApp,
javaInjectableTwitterServer,
scalaInjectableTwitterServer,
javaHttpServer,
scalaHttpServer,
thriftIdl,
javaThriftServer,
scalaThriftServer,
streamingExample,
twitterClone,
exampleWebDashboard
)
// END EXAMPLES
).aggregate(aggregatedProjects: _*)
lazy val injectCoreTestJarSources =
Seq(
"com/twitter/inject/InMemoryStats",
"com/twitter/inject/InMemoryStatsReceiverUtility",
"com/twitter/inject/InMemoryTracer",
"com/twitter/inject/IntegrationTest",
"com/twitter/inject/IntegrationTestMixin",
"com/twitter/inject/PoolUtils",
"com/twitter/inject/Test",
"com/twitter/inject/TestMixin",
"com/twitter/inject/WhenReadyMixin"
)
lazy val injectCore = (project in file("inject/inject-core"))
.settings(projectSettings)
.settings(
name := "inject-core",
moduleName := "inject-core",
libraryDependencies ++= Seq(
"com.google.inject" % "guice" % versions.guice,
"com.google.inject.extensions" % "guice-assistedinject" % versions.guice,
"com.twitter" %% "util-app" % versions.twLibVersion,
"com.twitter" %% "util-slf4j-api" % versions.twLibVersion,
"javax.inject" % "javax.inject" % "1",
"joda-time" % "joda-time" % versions.jodaTime,
"com.github.nscala-time" %% "nscala-time" % versions.nscalaTime,
"net.codingwell" %% "scala-guice" % versions.scalaGuice,
"org.joda" % "joda-convert" % versions.jodaConvert,
"org.scala-lang" % "scalap" % scalaVersion.value,
"com.google.inject" % "guice" % versions.guice % Test,
"com.google.inject.extensions" % "guice-testlib" % versions.guice % Test,
"com.twitter" %% "finagle-stats" % versions.twLibVersion % Test,
"com.twitter" %% "util-jackson" % versions.twLibVersion % Test,
"org.slf4j" % "slf4j-simple" % versions.slf4j % "test-internal"
),
Test / publishArtifact := true,
Test / packageBin / mappings := {
val previous = (Test / packageBin / mappings).value
previous.filter(mappingContainsAnyPath(_, injectCoreTestJarSources))
},
Test / packageDoc / mappings := {
val previous = (Test / packageDoc / mappings).value
previous.filter(mappingContainsAnyPath(_, injectCoreTestJarSources))
},
Test / packageSrc / mappings := {
val previous = (Test / packageSrc / mappings).value
previous.filter(mappingContainsAnyPath(_, injectCoreTestJarSources))
}
)
lazy val injectStack = (project in file("inject/inject-stack"))
.settings(projectSettings)
.settings(
name := "inject-stack",
moduleName := "inject-stack",
libraryDependencies ++= Seq(
"com.twitter" %% "finagle-core" % versions.twLibVersion,
),
)
lazy val injectLogback = (project in file("inject/inject-logback"))
.settings(projectSettings)
.settings(
name := "inject-logback",
moduleName := "inject-logback",
libraryDependencies ++= Seq(
"org.slf4j" % "slf4j-api" % versions.slf4j,
"ch.qos.logback" % "logback-classic" % versions.logback,
"ch.qos.logback" % "logback-core" % versions.logback,
"com.twitter" %% "finagle-core" % versions.twLibVersion,
"com.twitter" %% "util-core" % versions.twLibVersion,
"com.twitter" %% "util-registry" % versions.twLibVersion,
"com.twitter" %% "util-stats" % versions.twLibVersion
),
// we don't want test / slf4j-simple from any dependency (3rdparty or other module)
Test / excludeDependencies ++= Seq(
ExclusionRule(organization = "org.slf4j", name = "slf4j-simple")
)
).dependsOn(
injectCore % "test->test;compile->compile",
httpServer % "test->test;test->compile"
)
lazy val injectModulesTestJarSources =
Seq(
"com/twitter/inject/modules/InMemoryStatsReceiverModule",
"com/twitter/inject/modules/InMemoryTracerModule")
lazy val injectModules = (project in file("inject/inject-modules"))
.settings(projectSettings)
.settings(
name := "inject-modules",
moduleName := "inject-modules",
libraryDependencies ++= Seq(
"com.twitter" %% "finagle-core" % versions.twLibVersion,
"com.twitter" %% "util-stats" % versions.twLibVersion,
"org.slf4j" % "slf4j-simple" % versions.slf4j % "test-internal"
),
Test / publishArtifact := true,
(Test / packageBin / mappings) := {
val previous = (Test / packageBin / mappings).value
previous.filter(mappingContainsAnyPath(_, injectModulesTestJarSources))
},
(Test / packageDoc / mappings) := {
val previous = (Test / packageDoc / mappings).value
previous.filter(mappingContainsAnyPath(_, injectModulesTestJarSources))
},
(Test / packageSrc / mappings) := {
val previous = (Test / packageSrc / mappings).value
previous.filter(mappingContainsAnyPath(_, injectModulesTestJarSources))
}
).dependsOn(
injectCore % "test->test;compile->compile",
injectStack
)
lazy val injectAppTestJarSources =
Seq(
"com/twitter/inject/app/Banner",
"com/twitter/inject/app/BindDSL",
"com/twitter/inject/app/EmbeddedApp",
"com/twitter/inject/app/InjectionServiceModule",
"com/twitter/inject/app/InjectionServiceWithAnnotationModule",
"com/twitter/inject/app/StartupTimeoutException",
"com/twitter/inject/app/TestInjector"
)
lazy val injectApp = (project in file("inject/inject-app"))
.settings(projectSettings)
.settings(
name := "inject-app",
moduleName := "inject-app",
libraryDependencies ++= Seq(
"com.novocode" % "junit-interface" % "0.11" % Test,
"com.twitter" %% "finagle-core" % versions.twLibVersion % Test,
"com.twitter" %% "util-mock" % versions.twLibVersion % Test,
"com.twitter" %% "util-core" % versions.twLibVersion,
"com.twitter" %% "util-slf4j-jul-bridge" % versions.twLibVersion,
"org.slf4j" % "slf4j-api" % versions.slf4j,
"org.slf4j" % "slf4j-simple" % versions.slf4j % "test-internal"
),
Test / publishArtifact := true,
(Test / packageBin / mappings) := {
val previous = (Test / packageBin / mappings).value
previous.filter(mappingContainsAnyPath(_, injectAppTestJarSources))
},
(Test / packageDoc / mappings) := {
val previous = (Test / packageDoc / mappings).value
previous.filter(mappingContainsAnyPath(_, injectAppTestJarSources))
},
(Test / packageSrc / mappings) := {
val previous = (Test / packageSrc / mappings).value
previous.filter(mappingContainsAnyPath(_, injectAppTestJarSources))
}
).dependsOn(
injectCore % "test->test;compile->compile",
injectModules % "test->test",
injectUtils
)
lazy val injectDtab = (project in file("inject/inject-dtab"))
.settings(projectSettings)
.settings(
name := "inject-dtab",
moduleName := "inject-dtab",
libraryDependencies ++= Seq(
"com.twitter" %% "finagle-core" % versions.twLibVersion
)
).dependsOn(
injectApp
)
lazy val injectPorts = (project in file("inject/inject-ports"))
.settings(projectSettings)
.settings(
name := "inject-ports",
moduleName := "inject-ports",
libraryDependencies ++= Seq(
"com.twitter" %% "finagle-core" % versions.twLibVersion,
"com.twitter" %% "twitter-server" % versions.twLibVersion,
"com.twitter" %% "util-app" % versions.twLibVersion,
"org.slf4j" % "slf4j-simple" % versions.slf4j % "test-internal"
)
).dependsOn(
injectCore % "test->test"
)
lazy val injectServerTestJarSources =
Seq(
"com/twitter/inject/server/AdminHttpClient",
"com/twitter/inject/server/EmbeddedHttpClient",
"com/twitter/inject/server/EmbeddedTwitterServer",
"com/twitter/inject/server/FeatureTest",
"com/twitter/inject/server/FeatureTestMixin",
"com/twitter/inject/server/package"
)
lazy val injectServer = (project in file("inject/inject-server"))
.settings(projectSettings)
.settings(
name := "inject-server",
moduleName := "inject-server",
libraryDependencies ++= Seq(
"com.twitter" %% "util-slf4j-api" % versions.twLibVersion,
"com.twitter" %% "twitter-server" % versions.twLibVersion,
"org.slf4j" % "slf4j-api" % versions.slf4j,
"org.slf4j" % "slf4j-simple" % versions.slf4j % "test-internal"
),
Test / publishArtifact := true,
(Test / packageBin / mappings) := {
val previous = (Test / packageBin / mappings).value
previous.filter(mappingContainsAnyPath(_, injectServerTestJarSources))
},
(Test / packageDoc / mappings) := {
val previous = (Test / packageDoc / mappings).value
previous.filter(mappingContainsAnyPath(_, injectServerTestJarSources))
},
(Test / packageSrc / mappings) := {
val previous = (Test / packageSrc / mappings).value
previous.filter(mappingContainsAnyPath(_, injectServerTestJarSources))
}
).dependsOn(
injectApp % "test->test;compile->compile",
injectModules % "test->test;compile->compile",
injectPorts % "test->test;compile->compile",
injectUtils
)
lazy val injectMdc = (project in file("inject/inject-mdc"))
.settings(projectSettings)
.settings(
name := "inject-mdc",
moduleName := "inject-mdc",
libraryDependencies ++= Seq(
"com.twitter" %% "finagle-core" % versions.twLibVersion,
"com.twitter" %% "util-core" % versions.twLibVersion,
"com.twitter" %% "util-slf4j-api" % versions.twLibVersion,
"org.slf4j" % "slf4j-api" % versions.slf4j
)
).dependsOn(
injectCore % "test->test"
)
lazy val injectSlf4j = (project in file("inject/inject-slf4j"))
.settings(projectSettings)
.settings(
name := "inject-slf4j",
moduleName := "inject-slf4j",
libraryDependencies ++= Seq(
"com.twitter" %% "util-core" % versions.twLibVersion,
"com.twitter" %% "util-slf4j-api" % versions.twLibVersion,
"org.slf4j" % "slf4j-api" % versions.slf4j
)
).dependsOn(
injectCore % "test->test"
)
lazy val injectRequestScope = (project in file("inject/inject-request-scope"))
.settings(projectSettings)
.settings(
name := "inject-request-scope",
moduleName := "inject-request-scope",
libraryDependencies ++= Seq(
"com.twitter" %% "finagle-core" % versions.twLibVersion,
"org.slf4j" % "slf4j-simple" % versions.slf4j % "test-internal"
)
).dependsOn(
injectCore % "test->test;compile->compile",
injectApp % "test->test"
)
lazy val injectThrift = (project in file("inject/inject-thrift"))
.settings(projectSettings)
.settings(
name := "inject-thrift",
moduleName := "inject-thrift",
libraryDependencies ++= Seq(
"org.apache.thrift" % "libthrift" % versions.libThrift exclude ("commons-logging", "commons-logging"),
"com.twitter" %% "finagle-core" % versions.twLibVersion,
"com.twitter" %% "finagle-mux" % versions.twLibVersion % Test,
"com.twitter" %% "scrooge-core" % versions.twLibVersion,
"com.twitter" %% "util-core" % versions.twLibVersion,
"com.twitter" %% "util-mock" % versions.twLibVersion % Test,
"org.slf4j" % "slf4j-simple" % versions.slf4j % "test-internal"
)
).dependsOn(
injectCore % "test->test",
injectUtils
)
lazy val injectThriftClient = (project in file("inject/inject-thrift-client"))
.settings(projectSettings)
.settings(
name := "inject-thrift-client",
moduleName := "inject-thrift-client",
Test / scroogeLanguages := Seq("java", "scala"),
Test / scroogePublishThrift := true,
libraryDependencies ++= Seq(
"com.twitter" %% "finagle-thrift" % versions.twLibVersion,
"com.twitter" %% "finagle-thriftmux" % versions.twLibVersion,
"com.github.nscala-time" %% "nscala-time" % versions.nscalaTime,
"com.twitter" %% "finagle-http" % versions.twLibVersion % Test,
"org.slf4j" % "slf4j-simple" % versions.slf4j % "test-internal"
)
).dependsOn(
injectCore,
injectUtils,
injectApp % "test->test;compile->compile",
injectModules % "test->test;compile->compile",
injectThrift,
httpServer % "test->test",
thrift % "test->test",
utils
)
lazy val injectUtils = (project in file("inject/inject-utils"))
.settings(projectSettings)
.settings(
name := "inject-utils",
moduleName := "inject-utils",
libraryDependencies ++= Seq(
"com.twitter" %% "finagle-core" % versions.twLibVersion,
"com.twitter" %% "finagle-mux" % versions.twLibVersion,
"com.twitter" %% "util-core" % versions.twLibVersion,
"javax.xml.bind" % "jaxb-api" % versions.javaxBind,
"org.slf4j" % "slf4j-simple" % versions.slf4j % "test-internal"
)
).dependsOn(
injectCore % "test->test;compile->compile"
)
/**
* This project relies on other projects test dependencies and as such
* needs to have all of the benchmarks test / defined scope to play
* well with IDEs other build systems.
*
* @see https://github.com/ktoso/sbt-jmh/issues/63
*
* To run, open sbt console:
* {{{
* $ ./sbt
* > project benchmarks
* > jmh:run -i 10 -wi 20 -f1 -t1 .*JsonBenchmark.*
* }}}
*
* Which means "10 iterations" "20 warm up iterations" "1 fork" "1 thread". Note that
* benchmarks should be usually executed at 10 / least iterations (as a rule of thumb),
* but more is better.
*
* For "real" results the recommendation is to warm up at least 10 to 20 iterations, and then
* measure 10 to 20 iterations again. Forking the JVM is required to avoid falling into specific
* optimizations.
*/
lazy val benchmarks = project
.settings(baseServerSettings)
.enablePlugins(JmhPlugin)
.settings(
libraryDependencies ++= Seq("org.slf4j" % "slf4j-simple" % versions.slf4j % Test)
)
.settings(noPublishSettings)
.dependsOn(
httpMustache % "test",
httpServer,
injectRequestScope,
injectCore % "test->test",
injectApp % "test->test;compile->compile"
)
lazy val utilsTestJarSources =
Seq("com/twitter/finatra/modules/", "com/twitter/finatra/test/")
lazy val utils = project
.settings(projectSettings)
.settings(
name := "finatra-utils",
moduleName := "finatra-utils",
libraryDependencies ++= Seq(
"com.google.inject" % "guice" % versions.guice,
"joda-time" % "joda-time" % versions.jodaTime,
"com.github.nscala-time" %% "nscala-time" % versions.nscalaTime,
"com.twitter" %% "finagle-http" % versions.twLibVersion,
"com.twitter" %% "util-core" % versions.twLibVersion,
"com.twitter" %% "util-reflect" % versions.twLibVersion,
"javax.activation" % "activation" % versions.javaxActivation,
"org.slf4j" % "slf4j-simple" % versions.slf4j % "test-internal"
),
Test / publishArtifact := true,
(Test / packageBin / mappings) := {
val previous = (Test / packageBin / mappings).value
previous.filter(mappingContainsAnyPath(_, utilsTestJarSources))
},
(Test / packageDoc / mappings) := {
val previous = (Test / packageDoc / mappings).value
previous.filter(mappingContainsAnyPath(_, utilsTestJarSources))
},
(Test / packageSrc / mappings) := {
val previous = (Test / packageSrc / mappings).value
previous.filter(mappingContainsAnyPath(_, utilsTestJarSources))
}
).dependsOn(
injectApp % "test->test;compile->compile",
injectCore % "test->test",
injectServer % "test->test",
injectUtils
)
lazy val validationTestJarSources =
Seq(
"com/twitter/finatra/validation/ValidatorTest"
)
lazy val validation = project
.settings(projectSettings)
.settings(
name := "finatra-validation",
moduleName := "finatra-validation",
libraryDependencies ++= Seq(
"joda-time" % "joda-time" % versions.jodaTime,
"com.twitter" %% "util-core" % versions.twLibVersion,
"com.twitter" %% "util-reflect" % versions.twLibVersion,
"com.twitter" %% "util-validator" % versions.twLibVersion,
"org.json4s" %% "json4s-core" % versions.json4s,
"com.fasterxml.jackson.core" % "jackson-annotations" % versions.jackson % Test,
"org.slf4j" % "slf4j-simple" % versions.slf4j % "test-internal"
),
// special-case to only scaladoc what's necessary as some of the tests cannot generate scaladocs
Test / doc / sources := {
val previous: Seq[File] = (Test / doc / sources).value
previous.filter(file =>
validationTestJarSources.foldLeft(false)(_ || file.getPath.contains(_)))
},
Test / publishArtifact := true,
(Test / packageBin / mappings) := {
val previous = (Test / packageBin / mappings).value
previous.filter(mappingContainsAnyPath(_, validationTestJarSources))
},
(Test / packageDoc / mappings) := {
val previous = (Test / packageDoc / mappings).value
previous.filter(mappingContainsAnyPath(_, validationTestJarSources))
},
(Test / packageSrc / mappings) := {
val previous = (Test / packageSrc / mappings).value
previous.filter(mappingContainsAnyPath(_, validationTestJarSources))
}
).dependsOn(
injectCore % "test->test;compile->compile",
injectUtils,
utils % "test->test;compile->compile"
)
lazy val jackson = project
.settings(projectSettings)
.settings(
name := "finatra-jackson",
moduleName := "finatra-jackson",
libraryDependencies ++= Seq(
"com.fasterxml.jackson.core" % "jackson-annotations" % versions.jackson,
"com.fasterxml.jackson.core" % "jackson-databind" % versions.jackson,
"com.fasterxml.jackson.datatype" % "jackson-datatype-joda" % versions.jackson,
"com.fasterxml.jackson.module" % "jackson-module-guice" % versions.jackson,
"com.fasterxml.jackson.module" %% "jackson-module-scala" % versions.jackson,
"com.google.inject" % "guice" % versions.guice,
"javax.inject" % "javax.inject" % "1",
"org.json4s" %% "json4s-core" % versions.json4s,
"com.twitter" %% "finagle-http" % versions.twLibVersion % "test",
"com.twitter" %% "util-core" % versions.twLibVersion,
"com.twitter" %% "util-jackson" % versions.twLibVersion,
"com.twitter" %% "util-reflect" % versions.twLibVersion,
"com.twitter" %% "util-slf4j-api" % versions.twLibVersion,
"com.twitter" %% "util-validator" % versions.twLibVersion,
"org.slf4j" % "slf4j-simple" % versions.slf4j % "test-internal"
)
).dependsOn(
injectApp % "test->test",
injectCore,
injectUtils,
validation % "test->test;compile->compile",
utils
)
lazy val mustache = project
.settings(projectSettings)
.settings(
name := "finatra-mustache",
moduleName := "finatra-mustache",
libraryDependencies ++= Seq(
"javax.inject" % "javax.inject" % "1",
"com.github.spullara.mustache.java" % "compiler" % versions.mustache exclude ("com.google.guava", "guava"),
"com.google.inject" % "guice" % versions.guice,
"com.twitter" %% "util-core" % versions.twLibVersion,
"org.slf4j" % "slf4j-simple" % versions.slf4j % "test-internal"
)
).dependsOn(
injectApp % "test->test;compile->compile",
injectCore % "test->test;compile->compile",
utils
)
lazy val httpCore = (project in file("http-core"))
.settings(projectSettings)
.settings(
name := "finatra-http-core",
moduleName := "finatra-http-core",
libraryDependencies ++= Seq(
"com.fasterxml.jackson.core" % "jackson-annotations" % versions.jackson,
"com.fasterxml.jackson.core" % "jackson-databind" % versions.jackson,
"com.twitter" %% "finagle-http" % versions.twLibVersion,
"com.twitter" %% "util-reflect" % versions.twLibVersion,
"com.twitter" %% "util-jackson-annotations" % versions.twLibVersion,
"com.twitter" %% "util-jackson" % versions.twLibVersion,
"commons-fileupload" % "commons-fileupload" % versions.commonsFileupload,
"com.novocode" % "junit-interface" % "0.11" % Test,
"javax.servlet" % "servlet-api" % versions.servletApi % "provided;compile->compile;test->test"
),
Test / unmanagedResources / excludeFilter := "BUILD.bazel",
Test / publishArtifact := true
).dependsOn(
httpAnnotations,
jackson % "test->test;compile->compile",
utils % "test->test;compile->compile"
)
lazy val httpTestJarSources =
Seq(
"com/twitter/finatra/http/EmbeddedHttpServer",
"com/twitter/finatra/http/ExternalHttpClient",
"com/twitter/finatra/http/HttpMockResponses",
"com/twitter/finatra/http/HttpTest",
"com/twitter/finatra/http/JsonAwareEmbeddedHttpClient",
"com/twitter/finatra/http/RouteHint",
"com/twitter/finatra/http/StreamingJsonTestHelper",
"com/twitter/finatra/http/modules/ResponseBuilderModule",
"com/twitter/finatra/http/response/DefaultResponseBuilder"
)
lazy val httpServer = (project in file("http-server"))
.settings(projectSettings)
.settings(
name := "finatra-http-server",
moduleName := "finatra-http-server",
libraryDependencies ++= Seq(
"org.apache.thrift" % "libthrift" % versions.libThrift intransitive (),
"com.twitter" %% "finagle-http" % versions.twLibVersion,
"com.twitter" %% "util-core" % versions.twLibVersion % Test,
"com.twitter" %% "util-reflect" % versions.twLibVersion,
"com.twitter" %% "util-slf4j-api" % versions.twLibVersion,
"javax.servlet" % "servlet-api" % versions.servletApi % "provided;compile->compile;test->test",
"com.novocode" % "junit-interface" % "0.11" % Test,
"org.slf4j" % "slf4j-simple" % versions.slf4j % "test-internal",
"com.twitter" %% "util-security-test-certs" % versions.twLibVersion % Test
),
Test / unmanagedResourceDirectories += baseDirectory(
_ / "src" / "test" / "webapp"
).value,
Test / unmanagedResources / excludeFilter := "BUILD.bazel",
Test / publishArtifact := true,
(Test / packageBin / mappings) := {
val previous = (Test / packageBin / mappings).value
previous.filter(mappingContainsAnyPath(_, httpTestJarSources))
},
(Test / packageDoc / mappings) := {
val previous = (Test / packageDoc / mappings).value
previous.filter(mappingContainsAnyPath(_, httpTestJarSources))
},
(Test / packageSrc / mappings) := {
val previous = (Test / packageSrc / mappings).value
previous.filter(mappingContainsAnyPath(_, httpTestJarSources))
}
).dependsOn(
httpAnnotations,
httpClient % "test->test",
httpCore,
injectRequestScope % Test,
injectPorts % "test->test",
injectMdc,
injectServer % "test->test;compile->compile",
jackson % "test->test;compile->compile",
utils % "test->test;compile->compile",
validation % "test"
)
lazy val httpAnnotations = (project in file("http-annotations"))
.settings(projectSettings)
.settings(
name := "finatra-http-annotations",
moduleName := "finatra-http-annotations",
libraryDependencies ++= Seq(
"com.twitter" %% "util-jackson-annotations" % versions.twLibVersion
)
)
lazy val httpMustache = (project in file("http-mustache"))
.settings(projectSettings)
.settings(
name := "finatra-http-mustache",
moduleName := "finatra-http-mustache",
libraryDependencies ++= Seq(
"javax.inject" % "javax.inject" % "1",
"com.github.spullara.mustache.java" % "compiler" % versions.mustache exclude ("com.google.guava", "guava"),
"com.google.inject" % "guice" % versions.guice,
"com.twitter" %% "finagle-http" % versions.twLibVersion,
"com.twitter" %% "util-core" % versions.twLibVersion,
"org.slf4j" % "slf4j-simple" % versions.slf4j % "test-internal"
)
).dependsOn(
httpServer % "test->test;compile->compile",
httpAnnotations,
injectCore % "test->test;compile->compile",
injectUtils,
mustache % "test->test;compile->compile",
utils % "test->test;compile->compile"
)
lazy val httpClientTestJarSources =
Seq("com/twitter/finatra/httpclient/test/")
lazy val httpClient = (project in file("http-client"))
.settings(projectSettings)
.settings(
name := "finatra-http-client",
moduleName := "finatra-http-client",
libraryDependencies ++= Seq(
"com.twitter" %% "finagle-core" % versions.twLibVersion,
"com.twitter" %% "finagle-http" % versions.twLibVersion,
"com.twitter" %% "twitter-server" % versions.twLibVersion % Test,
"com.twitter" %% "util-core" % versions.twLibVersion,
"org.slf4j" % "slf4j-simple" % versions.slf4j % "test-internal"
),
Test / publishArtifact := true,
(Test / packageBin / mappings) := {
val previous = (Test / packageBin / mappings).value
previous.filter(mappingContainsAnyPath(_, httpClientTestJarSources))
},
(Test / packageDoc / mappings) := {
val previous = (Test / packageDoc / mappings).value
previous.filter(mappingContainsAnyPath(_, httpClientTestJarSources))
},
(Test / packageSrc / mappings) := {
val previous = (Test / packageSrc / mappings).value
previous.filter(mappingContainsAnyPath(_, httpClientTestJarSources))
}
).dependsOn(
httpCore,
jackson,
injectModules,
injectUtils,
injectApp % "test->test",
injectCore % "test->test"
)
lazy val thriftTestJarSources =
Seq(
"com/twitter/finatra/thrift/EmbeddedThriftServer",
"com/twitter/finatra/thrift/ThriftClient",
"com/twitter/finatra/thrift/ThriftTest")
lazy val thrift = project
.settings(projectSettings)
.settings(
name := "finatra-thrift",
moduleName := "finatra-thrift",
libraryDependencies ++= Seq(
"com.twitter" %% "finagle-core" % versions.twLibVersion,
"com.twitter" %% "finagle-exp" % versions.twLibVersion,
"com.twitter" %% "finagle-thrift" % versions.twLibVersion,
"com.twitter" %% "finagle-thriftmux" % versions.twLibVersion,
"com.twitter" %% "util-core" % versions.twLibVersion,
"com.twitter" %% "util-reflect" % versions.twLibVersion,
"com.twitter" %% "util-slf4j-api" % versions.twLibVersion,
"javax.inject" % "javax.inject" % "1",
"com.novocode" % "junit-interface" % "0.11" % Test,
"org.slf4j" % "slf4j-simple" % versions.slf4j % "test-internal"
),
Test / scroogePublishThrift := true,
Test / scroogeLanguages := Seq("java", "scala"),
unmanagedResources / excludeFilter := "BUILD.bazel",
Test / publishArtifact := true,
(Test / packageBin / mappings) := {
val previous = (Test / packageBin / mappings).value
previous.filter(mappingContainsAnyPath(_, thriftTestJarSources))
},
(Test / packageDoc / mappings) := {
val previous = (Test / packageDoc / mappings).value
previous.filter(mappingContainsAnyPath(_, thriftTestJarSources))
},
(Test / packageSrc / mappings) := {
val previous = (Test / packageSrc / mappings).value
previous.filter(mappingContainsAnyPath(_, thriftTestJarSources))
}
).dependsOn(
injectPorts % "test->test",
injectServer % "test->test;compile->compile",
injectMdc,
injectStack,
injectThrift
)
lazy val injectThriftClientHttpMapper = (project in file("inject-thrift-client-http-mapper"))
.settings(projectSettings)
.settings(
name := "inject-thrift-client-http-mapper",
moduleName := "inject-thrift-client-http-mapper",
Test / unmanagedResources / excludeFilter := "BUILD.bazel",
libraryDependencies ++= Seq(
"org.slf4j" % "slf4j-simple" % versions.slf4j % "test-internal"
)
).dependsOn(
httpServer % "test->test;compile->compile",
injectCore,
injectServer % "test->test",
injectThriftClient % "test->test;compile->compile",
thrift % "test->test;test->compile"
)
lazy val site = (project in file("doc"))
.enablePlugins(SphinxPlugin)
.settings(baseSettings ++ buildSettings ++ Seq(
doc / scalacOptions ++= Seq("-doc-title", "Finatra", "-doc-version", version.value),
Sphinx / includeFilter := ("*.html" | "*.png" | "*.svg" | "*.js" | "*.css" | "*.gif" | "*.txt")
))
// START EXAMPLES
// benchmark
lazy val benchmark = (project in file("examples/benchmark"))
.settings(baseServerSettings)
.settings(noPublishSettings)
.settings(
name := "benchmark-server",
moduleName := "benchmark-server",
Compile / mainClass := Some("com.twitter.finatra.http.benchmark.FinatraBenchmarkServerMain"),
libraryDependencies ++= Seq(
"org.slf4j" % "slf4j-nop" % versions.slf4j
)
).dependsOn(
httpServer % "test->test;compile->compile",
injectCore % "test->test"
)
// injectable-app
lazy val javaInjectableApp = (project in file("examples/injectable-app/java"))
.settings(exampleServerSettings)
.settings(noPublishSettings)
.settings(
name := "java-app",
moduleName := "java-app",
libraryDependencies ++= Seq(
"com.novocode" % "junit-interface" % "0.11" % Test,
"org.slf4j" % "slf4j-simple" % versions.slf4j % "test-internal",
"com.twitter" %% "util-slf4j-api" % versions.twLibVersion
)
).dependsOn(
injectApp % "test->test;compile->compile",
injectLogback,
injectModules
)
lazy val scalaInjectableApp = (project in file("examples/injectable-app/scala"))
.settings(exampleServerSettings)
.settings(noPublishSettings)
.settings(
name := "scala-app",
moduleName := "scala-app",
libraryDependencies ++= Seq(
"org.slf4j" % "slf4j-simple" % versions.slf4j % "test-internal",
"com.twitter" %% "util-slf4j-api" % versions.twLibVersion
)
).dependsOn(
injectApp % "test->test;compile->compile",
injectLogback,
injectModules
)
// injectable-twitter-server
lazy val javaInjectableTwitterServer = (project in file("examples/injectable-twitter-server/java"))
.settings(exampleServerSettings)
.settings(noPublishSettings)
.settings(
name := "java-twitter-server",
moduleName := "java-twitter-server",
libraryDependencies ++= Seq(
"com.novocode" % "junit-interface" % "0.11" % Test,
"org.slf4j" % "slf4j-simple" % versions.slf4j % "test-internal",
"com.twitter" %% "util-core" % versions.twLibVersion,
"com.twitter" %% "util-slf4j-api" % versions.twLibVersion
)
).dependsOn(
injectServer % "test->test;compile->compile",
injectCore % "test->test",
injectApp % "test->test",
utils
)
lazy val scalaInjectableTwitterServer =
(project in file("examples/injectable-twitter-server/scala"))
.settings(exampleServerSettings)
.settings(noPublishSettings)
.settings(
name := "scala-twitter-server",
moduleName := "scala-twitter-server",
libraryDependencies ++= Seq(
"com.twitter" %% "util-mock" % versions.twLibVersion % Test,
"org.slf4j" % "slf4j-simple" % versions.slf4j % "test-internal",
"com.twitter" %% "util-slf4j-api" % versions.twLibVersion
)
).dependsOn(
injectServer % "test->test;compile->compile",
utils
)
// http server
lazy val javaHttpServer = (project in file("examples/http-server/java"))
.settings(exampleServerSettings)
.settings(noPublishSettings)
.settings(
name := "java-http-server",
moduleName := "java-http-server",
libraryDependencies ++= Seq(
"com.novocode" % "junit-interface" % "0.11" % Test,
"com.twitter" %% "util-jackson" % versions.twLibVersion,
"org.slf4j" % "slf4j-simple" % versions.slf4j % "test-internal"
)
).dependsOn(
httpServer % "test->test;compile->compile",
httpClient,
injectCore % "test->test",
injectLogback
)
lazy val scalaHttpServer = (project in file("examples/http-server/scala"))
.settings(exampleServerSettings)
.settings(noPublishSettings)
.settings(
name := "scala-http-server",
moduleName := "scala-http-server",
libraryDependencies ++= Seq(
"org.slf4j" % "slf4j-simple" % versions.slf4j % "test-internal"
)
).dependsOn(
httpServer % "test->test;compile->compile",
injectCore % "test->test",
injectLogback
)
// thrift server
lazy val thriftIdl = (project in file("examples/thrift-server/idl"))
.settings(baseServerSettings)
.settings(noPublishSettings)
.settings(
name := "thrift-server-idl",
moduleName := "thrift-example-idl",
Compile / scroogeLanguages := Seq("java", "scala"),
Compile / scroogeThriftIncludeFolders := Seq(file("examples/thrift-server/idl/src/main/thrift"))
).dependsOn(
thrift
)
lazy val javaThriftServer = (project in file("examples/thrift-server/java"))
.settings(exampleServerSettings)
.settings(noPublishSettings)
.settings(
name := "java-thrift-server",
moduleName := "java-thrift-server",
libraryDependencies ++= Seq(
"com.novocode" % "junit-interface" % "0.11" % Test,
"org.slf4j" % "slf4j-simple" % versions.slf4j % "test-internal",
"com.twitter" %% "util-slf4j-api" % versions.twLibVersion
)
).dependsOn(
thriftIdl,
thrift % "test->test;compile->compile",
injectApp % "test->test",
injectCore % "test->test",
injectServer % "test->test",
injectLogback
)
lazy val scalaThriftServer = (project in file("examples/thrift-server/scala"))
.settings(exampleServerSettings)
.settings(noPublishSettings)
.settings(
name := "scala-thrift-server",
moduleName := "scala-thrift-server",
libraryDependencies ++= Seq(
"org.slf4j" % "slf4j-simple" % versions.slf4j % "test-internal"
)
).dependsOn(
thriftIdl,
thrift % "test->test;compile->compile",
injectApp % "test->test",
injectCore % "test->test",
injectServer % "test->test",
injectLogback
)
// advanced examples
lazy val streamingExample = (project in file("examples/advanced/streaming-example"))
.settings(exampleServerSettings)
.settings(noPublishSettings)
.settings(
name := "streaming-example",
moduleName := "streaming-example",
libraryDependencies ++= Seq(
"com.twitter" % "joauth" % "6.0.2",
"org.slf4j" % "slf4j-simple" % versions.slf4j % "test-internal"
)
).dependsOn(
httpServer % "test->test;compile->compile",
injectCore % "test->test",
injectLogback
)
lazy val twitterClone = (project in file("examples/advanced/twitter-clone"))
.settings(exampleServerSettings)
.settings(noPublishSettings)
.settings(
name := "twitter-clone",
moduleName := "twitter-clone",
libraryDependencies ++= Seq(
"com.twitter" %% "util-core" % versions.twLibVersion,
"com.twitter" %% "util-jackson" % versions.twLibVersion,
"com.twitter" %% "util-mock" % versions.twLibVersion % Test,
"com.twitter" %% "util-slf4j-api" % versions.twLibVersion,
"org.slf4j" % "slf4j-simple" % versions.slf4j % "test-internal"
)
).dependsOn(
httpServer % "test->test;compile->compile",
httpClient,
injectCore % "test->test",
injectDtab,
injectLogback,
validation
)
lazy val exampleWebDashboard = (project in file("examples/advanced/web-dashboard"))
.settings(exampleServerSettings)
.settings(noPublishSettings)
.settings(
name := "web-dashboard",
moduleName := "web-dashboard",
Compile / unmanagedResourceDirectories += baseDirectory.value / "src" / "main" / "webapp",
libraryDependencies ++= Seq(
"org.slf4j" % "slf4j-simple" % versions.slf4j % "test-internal"
)
).dependsOn(
httpServer % "test->test;compile->compile",
httpMustache,
httpClient,
injectCore % "test->test",
injectLogback,
mustache
)
// END EXAMPLES