将多个相关的项目定义在一个构建中是很有用的,尤其是如果它们依赖另一个,而且你倾向于一起修改它们。
每个子项目在构建中都有它们自己的源文件夹,当打包时生成各自的 jar 文件,而且通常和其他的项目一样运转。
1,先通过idea创建一个普通的sbt项目
2,改造项目目录,以下是改造过的
MacBook-Pro:sbt_multi zhangying$ tree -L 3 . ├── build.sbt ├── order //子项目 │ ├── src │ │ ├── main │ │ └── test │ └── target │ ├── scala-2.11 │ └── streams ├── project │ ├── Dependencies.scala │ ├── build.properties │ ├── plugins.sbt │ ├── project │ │ └── target │ └── target │ ├── config-classes │ ├── scala-2.12 │ └── streams ├── target │ ├── scala-2.11 │ │ └── resolution-cache │ └── streams │ ├── $global │ ├── compile │ ├── runtime │ └── test └── user //子项目 ├── src │ ├── main │ └── test └── target ├── scala-2.11 └── streams 29 directories, 4 files
3,sbt版本
# cat project/build.properties sbt.version = 1.2.8
4,安装assembly插件
# cat project/plugins.sbt addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.9")
5,创建project/Dependencies.scala
# cat project/Dependencies.scala import sbt._ object Dependencies { // 统一管理依赖版本 val akkaVersion = "2.5.4" val sparkVersion = "2.3.0" // Akka Libraries val akkaActor = "com.typesafe.akka" %% "akka-actor" % akkaVersion val akkaTestkit = "com.typesafe.akka" %% "akka-testkit" % akkaVersion //json val json = "com.alibaba" % "fastjson" % "1.2.49" // user子项目的依赖,在build.sbt中使用 val spark = Seq( "org.apache.spark" % "spark-core_2.11" % sparkVersion, "org.apache.spark" % "spark-sql_2.11" % sparkVersion ) // order子项目的依赖,在build.sbt中使用 val orderPro = Seq(akkaActor,akkaTestkit,json) }
6,创建build.sbt
import Dependencies._ lazy val root = (project in file(".")) .aggregate(user,order) //对应下面的子项目,文件夹名 .settings( inThisBuild(List( organization := "com.mytest", scalaVersion := "2.11.8", version := "0.0.1-SNAPSHOT", externalResolvers := List("Aliyun Mirror" at "http://maven.aliyun.com/nexus/content/groups/public") )), name := "mytest" ) //user 子项目 lazy val user = project .settings( name := "mytest-user", libraryDependencies ++= spark // 引入Dependencies.scala中的依赖设置 ) //order 子项目 lazy val order = project .dependsOn(user) // order子项目依赖于user子项目 .settings( name := "mytest-order", mainClass in assembly := Some("com.mytest.WordCount"), libraryDependencies ++= orderPro // 引入Dependencies.scala中的依赖设置 ) assemblyMergeStrategy in assembly := { case PathList("javax", "inject", xs @ _*) => MergeStrategy.first case PathList("org", "apache", xs @ _*) => MergeStrategy.first case "application.conf" => MergeStrategy.concat case "git.properties" => MergeStrategy.first case PathList("org", "aopalliance", xs @ _*) => MergeStrategy.first case "unwanted.txt" => MergeStrategy.discard case m if m.toLowerCase.endsWith("manifest.mf") => MergeStrategy.discard case PathList("META-INF", xs @ _*) => MergeStrategy.discard case x => val oldStrategy = (assemblyMergeStrategy in assembly).value oldStrategy(x) }
7,加载包后,看一下结果
转载请注明
作者:海底苍鹰
地址:http://blog.51yip.com/hadoop/2169.html