【发布时间】:2018-11-14 14:47:02
【问题描述】:
Intellij 为我做了什么而 sbt 不是?
我正在开发一个 Scala 项目,我希望为其支持用户定义的插件类。我已经实现了 ClassLoader 的子类:
class PluginLoader(directory: String) extends ClassLoader {
override def findClass(className: String): Class[_] = {
val bytes = loadClassData(className)
defineClass(className,bytes,0,bytes.length)
}
def loadClassData(className: String): Array[Byte] = {
val fileName = className.replace('.',File.separatorChar) + ".class"
val file = new File(directory,fileName)
val bytes = new Array[Byte](file.length.toInt)
val inputStream = new DataInputStream(new FileInputStream(file))
inputStream.readFully(bytes)
inputStream.close()
bytes
}
}
我用用户定义的目录和预编译的 scala 类的名称来调用它:
new PluginLoader(directory).loadClass(className).newInstance()
findClass 似乎成功地找到了用户提供的课程。但是,它会被再次调用以寻找scala.runtime.java8.JFunction2$mcIII$sp.class。它在用户提供的目录中查找,因此找不到加载的类。
这是我得到的错误:(run-main-0) java.io.FileNotFoundException: ./scala/runtime/java8/JFunction2$mcIII$sp.class (No such file or directory)
我已经在 Intellij 中成功运行了这个应用程序,这让我觉得我在 sbt 中缺少一些配置,而 Intellij 正在为我发现我的错误。
我需要做额外的配置吗?我应该加载整个 jar 文件而不是只传递一个类文件吗?
【问题讨论】:
标签: java scala intellij-idea sbt runtime