You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 04:15:20