问题描述
我正在使用 Scala REPL(实际上是 spark-shell)来测试一个想法。我正在使用由“maven-shade-plugin”创建的程序集 jar 来提供我需要测试的所有依赖项。在我的环境中启动 spark-shell 还会向类路径添加一些其他内容,这些内容应该由我的程序集 jar 遮蔽。其中之一是org.apache.thrift
。因此,为清楚起见,当 spark-shell 以 spark-shell --jars './my.jar'
启动时,我可以访问:
org.apache.thrift
和
com.my.example.shaded.org.apache.thrift
我有一个定制的类,它的构造函数看起来像这样:
import org.apache.thrift.TFieldIdEnum
class MyClass(arg1: TFieldIdEnum) { /* class code here */}
这个类被打包,编译后的 .class 文件如下所示:
import com.my.example.shaded.org.apache.thrift.TFieldIdEnum
class MyClass(arg1: TFieldIdEnum) { /* class code here */}
我确认我使用的文件与 JD-GUI 看起来像这样。
当我尝试实例化 MyClass 对象时,出现如下错误:
(arg1: org.apache.thrift.TFieldIdEnum)com.my.example.MyClass
cannot be applied to (com.my.example.shaded.org.apache.thrift.TFieldIdEnum)
val ex = new MyClass(shadedTFieldIdEnumObj)
(请忽略该错误涉及重载方法,即来自实际类,我从中得到错误,该类具有相同类型的重载构造函数)
什么会导致 ClassLoader 或 REPL 忽略在我指定的 jar 中找到的 .class 文件中为构造函数定义的类型?
进一步澄清,MyClass 不在默认类路径中,我访问它的唯一方法是使用上面显示的 --jars
参数指定 jar。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)