manage project dependencies with SBT

本文最后更新于:Thursday, December 3rd 2020, 10:20 pm

Dependency

依赖分为:托管依赖「managed」和非托管依赖「unmanaged」

Unmanaged

非托管依赖:比如JAR包

使用方法:

  • 把需要的JAR包拷贝到项目根目录的lib文件夹 下。
  • 如果该JAR包还依赖其它JAR包,你也要下载其它JAR并把其同样拷贝到lib目录中

缺点:

  • 要自己解决包依赖关系,一旦项目变大了,靠手工维护基本不可能

Managed(key)

托管依赖:通过给定项目一些属性,由构建工具(如sbt)自动去默认仓库下载。

Single lib

基本语法: 写在项目的「build.sbt」文件中

1
libraryDependencies += groupID % artifactID % revision % configuration

最小完整的文件:

1
2
3
4
5
6
7
name := "BasicProjectWithScalaTest"  // 项目名称

version := "1.0" // 项目版本

scalaVersion := "2.10.0" // 项目Scala版本

libraryDependencies += "org.scalatest" %% "scalatest" % "1.9.1" % "test"
  • 👆方法说明:
MethodDescription
+=键值对;用+=表示给键(libraryDependencies)附加值
%用于从你提供的字符串中构建Ivy module ID
%%当其在groupID后使用时,自动把你项目Scala版本号添加到工件名字末尾

example:👇两个等效

1
2
libraryDependencies += "org.scalatest" % "scalatest_2.10" % "1.9.1" % "test"
libraryDependencies += "org.scalatest" %% "scalatest" % "1.9.1" % "test"

libraryDependencies可以在sbt默认远程仓库中找到

mark

notes:

  • 假设你添加一个依赖,但是这个工件依赖其它的工件,那么sbt会自动帮你下载依赖,这是非托管无法比拟的
  • 工件的版本很总要;一定要与自己项目中Scala版本兼容
  • SBT使用Apache Ivy作为自己的依赖管理器,而Ivy也被AntMaven使用,因此能在Scala项目中很容易使用多年来创建的丰富Java库。
  • SBT使用standard Maven repository作为默认仓库(索引的工件数截至2020/12/03已经是18.4M); 如果你需要的库没有发布到改标准库中,你必须告诉SBT去哪里寻找,这个过程通过添加一个resolver解决

Multiple lib

  • 使用Seq方法(注意是++=

    1
    2
    3
    4
    5
    libraryDependencies ++= Seq(
    "net.sourceforge.htmlcleaner" % "htmlcleaner" % "2.4",
    "org.scalatest" % "scalatest_2.10" % "1.9.1" % "test",
    "org.foobar" %% "foobar" % "1.8"
    )

    Multiple project

  • 使用lazy:构建多个项目

    mark

  • 使用projects:查看项目结构

mark

  • 使用.dependsOn:主项目依赖可以移到子项目中,然后显示指明

    1
    .dependsOn(helloCore)    // 表示依赖子项目
  • 使用dist:生成通用jar包

    • 在~/project/plugins.sbt添加插件 『~代表项目根目录』

      1
      addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.3.4")  // 添加sbt-native-packager插件,用于打包universal package
    • 在build.sbt中添加JavaAppPackaging

      1
      .enablePlugins(JavaAppPackaging) // 用于打包dist? 

      mark

  • 使用publishlocal: 把包发布到本地

    • 默认是在~\.ivy2\local\文件夹下

    • 严格按照上述groupID % artifactID % revision % configuration来组织

      mark

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    -com.example        // groupID
    - hello_2.12 // artifactID
    - 1.0.0 // revision
    - docs
    - ivys
    - jars
    - proms
    - scrs
    - hello-core_2.12 // 子项目生成的工件
    - 1.0.0
    - docs
    - ivys
    - jars
    - proms
    - scrs
    - 0.1.0-SNAPSHOT(这是自前发布的)
    - docs
    - ivys
    - jars
    - proms
    - scrs
  • 使用Docker/publishLocal:生成镜像

References

[1] sbt-by-example

[2] sbt-how-to-manage-project-dependencies-in-scala

[3] mvnrepo-chisel3-core

[4] Sbt 依赖配置


本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!