为什么 运行 通过 jenkins 用户对 build slave 进行的测试会因缺少 scala-library.jar 而失败?

Why does running tests through jenkins user on build slave fail with Missing scala-library.jar?

我正在尝试 运行 一项詹金斯工作,由于以下原因而失败:java.lang.RuntimeException: Missing scala-library.jar 运行宁此行时: /usr/lib/jvm/java-1.8.0/bin/java -Xmx4250M -Dsbt.log.noformat=true -jar /tmp/jenkins/slaves/build-slave-cb996aa/tools/org.jvnet.hudson.plugins.SbtPluginBuilder_SbtInstallation/default/bin/sbt-launch.jar 'set credentials += Credentials("Artifactory Realm", $ARTIFACTORY_HOST, $USER, $PASSWORD)' assembly

当 运行从我自己的机器上的用户或从 root 用户使用时,它工作正常(从 jFrog 获取工件,编译,运行s 测试并打包 jar),但是当来自用户 jenkins 的 运行ning 失败时。

我发现当 运行 从根目录中打开它时,它会在路径 /root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.11.11/scala-library-2.11.11.jar

中找到库

我 运行 sbt.version = 0.13.8scalaVersion := "2.11.11" 我显然不希望 jenkins 工作使用 root 工作,我们都知道那是不对的。 完整堆栈是:

java.lang.RuntimeException: Missing scala-library.jar
        at scala.sys.package$.error(package.scala:27)
        at sbt.Defaults$$anonfun$scalaInstanceFromUpdate$$anonfun$file.apply(Defaults.scala:382)
        at sbt.Defaults$$anonfun$scalaInstanceFromUpdate$$anonfun$file.apply(Defaults.scala:382)
        at scala.Option.getOrElse(Option.scala:120)
        at sbt.Defaults$$anonfun$scalaInstanceFromUpdate.file(Defaults.scala:382)
        at sbt.Defaults$$anonfun$scalaInstanceFromUpdate.apply(Defaults.scala:384)
        at sbt.Defaults$$anonfun$scalaInstanceFromUpdate.apply(Defaults.scala:374)
        at scala.Function1$$anonfun$compose.apply(Function1.scala:47)
        at sbt.$tilde$greater$$anonfun$$u2219.apply(TypeFunctions.scala:40)
        at sbt.std.Transform$$anon.work(System.scala:63)
        at sbt.Execute$$anonfun$submit$$anonfun$apply.apply(Execute.scala:226)
        at sbt.Execute$$anonfun$submit$$anonfun$apply.apply(Execute.scala:226)
        at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:17)
        at sbt.Execute.work(Execute.scala:235)
        at sbt.Execute$$anonfun$submit.apply(Execute.scala:226)
        at sbt.Execute$$anonfun$submit.apply(Execute.scala:226)
        at sbt.ConcurrentRestrictions$$anon$$anonfun.apply(ConcurrentRestrictions.scala:159)
        at sbt.CompletionService$$anon.call(CompletionService.scala:28)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
[error] (*:scalaInstance) Missing scala-library.jar

谢谢!

看起来 root 用户的库路径指向 .cache。您是否尝试清除缓存。

你也可以通过执行从

获得的以下命令来尝试

https://github.com/sbt/sbt-assembly

assemblyOption in assembly := (assemblyOption in assembly).value.copy(includeScala = true)

几周前我遇到了类似的问题。如果我没记错的话,我的 SBT 构建使用了 coursier 插件(导致 ~/.coursier%HOME%\.coursier on Windows—由构建创建和维护的目录)并且我还在使用本地工件存储库(Nexus OSS,在我的例子中)。

我的问题原来是我的构建使用的 coursier 插件的版本。如果您使用的是 coursier v1.0.0-RC2(或者可能是 v1.0.0-RC3)或更早版本,那么这可能解释你的问题。

解决方案是删除 .coursier.ivy2 目录(在本地缓存一些工件),将 coursier 的版本更改为 V1.0.0- RC4 或更高版本,然后重试构建。 (在你的情况下,这些目录将在你的 Jenkins 服务器上,在 jenkins 帐户主页中。)