我正在开发一个scala编译器插件。编译器插件在"refcheck"阶段之后运行。它分析AST(抽象语法树)并生成一些输出。在这个插件中,我正在使用System.loadLibrary
加载本机库"scalaz3.dll"
我计划将编译器插件与Eclipse Scala IDE一起使用。我在 ScalaIde 首选项中设置了 -XPlugin
参数。当我在 Eclipse 中编译 scala 源文件时,该插件在refchecks
阶段后被调用并且工作正常(生成所需的输出)
但是,当我对源文件进行更改并进行编译时,出现以下错误。
The SBT builder crashed while compiling your project.
Native Library scalaz3.dll already loaded in another classloader.
看起来 ScalaIDE 会生成另一个类加载器并尝试在同一进程中加载插件类。
我在编译器插件测试用例中遇到了同样的问题。但是,我使用build.sbt
中的fork in Test := true
修复了它。但是我对如何在 eclipse scala IDE 中修复它一无所知。
以下是一些相关的帖子(尽管与 eclipse scala ide 无关):
- .dll已经加载到另一个类加载器中了吗?
- http://www.coderanch.com/t/79145/Websphere/Native-lib-already-loaded-another
- http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4750956
IDE 在进程中使用 sbt,因此没有等效的分叉。您不能只加载一次 dll,例如将其加载到object
的构造函数中吗?
此处建议使用该技术:
调用
System.loadLibrary(String)
的类必须由不受重装 Web 应用程序影响的类装入器本身。因此,如果您的 JNI 代码遵循包含静态启动器如下所示:
class FooWrapper { static { System.loadLibrary("foo"); } native void doFoo(); }
[...]