Scala嵌入式编译报Missing dependency错误求助:JNI类调用异常
问题
使用scala-compiler.jar编译一个嵌入式Scala程序,该程序引入了JNI编写的类DllTest,相关代码如下:
class test{ def test(ctx: ContractContext): ActionResult = { val s = new DllTest s.loadLibrary() print(s.intMethod(5)) null } }
编译时出现如下错误:
error: error while loading Object, Missing dependency 'object scala.native in compiler mirror', required by /modules/java.base/java/lang/Object.class Failed to initialize compiler: object scala in compiler mirror not found. ** Note that as of 2.8 scala does not assume use of the java classpath. ** For the old behavior pass -usejavacp to scala, or if using a Settings ** object programmatically, settings.usejavacp.value = true.
但在main函数中调用该JNI类的代码可正常运行:
def main(args: Array[String]): Unit = { //Create system instance val s = new DllTest s.loadLibrary() print(s.intMethod(5)) ...... }
请问该错误的原因是什么?如何解决?
原因分析
- Scala 2.8及以后版本,编译器默认不再自动沿用Java的类路径配置。用
scala-compiler.jar编译嵌入式代码时,没把Scala核心库(比如scala-library.jar这类关键依赖)加入编译类路径,导致编译器找不到scala包下的核心对象,初始化失败。 - main函数能正常运行,是因为运行环境已经正确配置了包含Scala核心库的类路径,而编译阶段的类路径配置没跟上,两者环境不一致导致了这个差异。
解决方法
方法1:启用usejavacp参数
如果是命令行编译,添加-usejavacp参数让编译器复用Java类路径查找Scala核心库:
scala -usejavacp -cp 你的依赖.jar:scala-library.jar 你的程序.scala
如果是代码调用Scala编译器(嵌入式场景),在Settings对象中开启该配置:
import scala.tools.nsc.Global import scala.tools.nsc.Settings val settings = new Settings() settings.usejavacp.value = true val compiler = new Global(settings) // 后续执行编译逻辑
方法2:显式指定Scala核心库路径
编译时直接把scala-library.jar、scala-compiler.jar等必要的Scala核心库添加到类路径:
scala -cp scala-library.jar:scala-compiler.jar:你的依赖.jar 你的程序.scala
额外注意点
- 确保
DllTest对应的JNI库(.dll或.so文件)在运行时处于系统库路径中,或者通过System.load()指定绝对路径,避免运行时找不到库文件。 - 嵌入式编译场景下,要保证编译器的类路径包含所有依赖的类和库,包括Scala自身的核心库和自定义的JNI相关类。
内容的提问来源于stack exchange,提问作者tony
相关产品推荐
相关产品推荐

