sbt常见问题
Easul Lv6

SBT常见问题

  • 安装时出现java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
    这个是因为证书错误,可以下载一个新的版本的jdk,找到他的证书,然后复制到当前安装的jdk的证书路径
    这里以安装的open jdk8和新下载的open jdk11为例

    BASH
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 下载JDK11,:http://jdk.java.net/11/
    mkdir ~/software && cd ~/software
    wget https://download.java.net/java/GA/jdk11/13/GPL/openjdk-11.0.1_linux-x64_bin.tar.gz
    tar -zxvf openjdk-11.0.1_linux-x64_bin.tar.gz
    rm -rf openjdk-11.0.1_linux-x64_bin.tar.gz
    # 备份原路径下的jdk8
    mv ~/software/java-se-8u41-ri/jre/lib/security/cacerts ~/software/java-se-8u41-ri/jre/lib/security/cacerts.bak
    # 将jdk11的证书复制到jdk8中
    cp ~/software/jdk-11.0.1/lib/security/cacerts ~/software/java-se-8u41-ri/jre/lib/security/cacerts
    # 然后测试是否成功,如果还有同样的问题可能需要再换个别的版本的jdk
    sbt --version
  • not found: https://maven.aliyun.com/repository/public/com/typesafe/config_2.12/1.2.1/config_2.12-1.2.1.pom

    1. 很显然,自己的包在这个仓库找不到。要么是自己包的格式不对,要么就是这个仓库没有这个包。改改依赖版本或者新增一个别的仓库即可
    2. 阿里云的maven找到该jar包的pom.sha256pom文件,然后改成上边找不到的文件名,复制到对应包的pom位置即可
    3. 因为在groupId后加了%%,导致sbt下载依赖包的时候老是自动加上scala的版本,修改为%即可
      1
      2
      3
      4
      // 原本是这个,会自动加上scala的版本
      libraryDependencies += "com.typesafe" %% "config" % "1.4.0"
      // 修改为一个%就没有问题了
      libraryDependencies += "com.typesafe" % "config" % "1.4.0"
      参考
  • 解决冲突相同的类冲突
    不需要的类丢弃即可,在build.sbt添加如下配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    assemblyMergeStrategy in assembly := {
    case x if x.endsWith("UnusedStubClass.class") => MergeStrategy.discard
    case x if x.contains("org/apache/commons/collections") => MergeStrategy.discard
    case x if x.contains("javax/inject") => MergeStrategy.discard
    case x if x.contains("org/aopalliance") => MergeStrategy.discard
    case x if x.endsWith("package-info.class") => MergeStrategy.discard
    case x if x.endsWith("git.properties") => MergeStrategy.discard
    case x =>
    val oldStrategy = (assemblyMergeStrategy in assembly).value
    oldStrategy(x)
    }

    对于同名不同包的类的处理

  • sbt添加assembly编译fat jar
    project/assembly.sbt添加如下代码,即可在项目根目录通过sbt assembly编译fat jar

    1
    addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.15.0")

    编译的时候,$SPARK_HOMEjars目录已有且版本相同的jar就不需要编译了(在版本号后边添加% "provided"即可)

  • sbt添加可以查看依赖树的插件
    ~/.sbt/1.0/plugins/plugins.sbt添加如下代码

    1
    addDependencyTreePlugin

    然后进入sbt命令行

    使用dependencyTree可以看项目中所有的依赖树
    使用whatDependsOn groupId artifactId version查看某个依赖包的依赖树
    使用sbt "project 项目名" dependencyTree >> dependencyTree.txt可以将所有依赖树导出到文件

Sbt 排除依赖冲突详细解析

  • 在scala添加测试工具
    build.sbt增加如下工具
    1
    libraryDependencies += "org.scalatest" % "scalatest-app_2.12" % "3.2.7" % "test"
    然后在src/test/scala下创建自己的Test.scala测试类,内容如下
    SCALA
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import org.scalatest.funsuite.AnyFunSuite

    class Test extends AnyFunSuite {
    test("mytest") {
    doSth()
    }

    def doSth() = {
    println("hello scala")
    }
    }
 评论