在使用sbt构建一个spark 的项目的时候 遇到一个很奇怪的问题 Missing scala-library.jar 如下图. 按理来说如果少jar包sbt 会自动去下载的 这个就很奇怪了.

于是想到用arthas 看一下.首先在arthas中用jad反编译了下scala.sys.pachage\$ 的代码 .
$ jad -c 42a57993 "scala.sys.package$"
ClassLoader:
+-sun.misc.Launcher$AppClassLoader@42a57993
+-sun.misc.Launcher$ExtClassLoader@10d307f1
Location:
/usr/local/Cellar/sbt/1.2.8/libexec/bin/sbt-launch.jar
/*
* Decompiled with CFR 0_132.
*/
package scala.sys;
import scala.runtime.Nothing$;
import scala.sys.SystemProperties;
public final class package$ {
public static final package$ MODULE$;
private package$() {
MODULE$ = this;
}
static {
new scala.sys.package$();
}
public static SystemProperties props() {
return new SystemProperties();
}
public static Nothing$ error(String string) {
throw new RuntimeException(string);
}
}
Affect(row-cnt:1) cost in 361 ms.
$ jad "sbt.Defaults$" >> &
job id : 10
cache location : /Users/.../logs/arthas-cache/27659/10
在logs/arthas-cache/27659/10文件中找到file$1这个方法
841 private static final File file$1(String id, ConfigurationReport toolReport$1) {
842 return (File)Defaults$.files$1(id, toolReport$1).headOption().getOrElse(() -> package$.MODULE$.error(new StringContext((Seq)Predef$.MODULE$.wrapRefArray(new String[] {"Missing ", ".jar"})).s((Seq)Predef$.MODULE$.genericWrapArray(new Object[]{id}))));
843 }
watch -b -x 4 "sbt.Defaults$" "file$1" params
果然在参数中找到了scala-library字样 并且还有这个jar包路径.

那继续我们去这个路径下看下 , 如下图确实少了jar文件. 但是目录是有的. 这很有可能是以前下载jar文件时中断了, 导致jar包没有但是目录还在

那处理就很简单. 把这个目录删掉. 重新构建. 重新构建 sbt就会自动下载jar包了 问题解决了...

实践是好实践。
但貌似解决这个问题绕了地球一大圈。
但貌似解决这个问题绕了地球一大圈
有什么更好的办法 , 也可以交流下
一般maven或sbt报找不到jar或class,不都应该第一时间去下载目录核对一下么?
是的 , 你看我解决问题的步骤就是 删掉那个无效的目录. 然后sbt 就会自动去下载了
个人愚见,排查问题的过程,是一个不断学习的过程。积累的经验对以后查问题很有帮助。每个人都有自己的知识图谱,都有自己不同的解决问题思路,互相学习也很有好处。😄
Most helpful comment
个人愚见,排查问题的过程,是一个不断学习的过程。积累的经验对以后查问题很有帮助。每个人都有自己的知识图谱,都有自己不同的解决问题思路,互相学习也很有好处。😄