2

scala コンパイラ プラグインを開発しています。コンパイラ プラグインは、「refcheck」フェーズの後に実行されます。AST (抽象構文ツリー) を分析し、いくつかの出力を生成します。このプラグインでは、次を使用してネイティブ ライブラリ「scalaz3.dll」をロードしています。System.loadLibrary

コンパイラ プラグインを Eclipse Scala IDE で使用する予定です。-XPluginScalaIde プリファレンスでパラメーターを設定します。Eclipse で scala ソース ファイルをコンパイルすると、refchecksフェーズの後にプラグインが呼び出され、正常に動作します (目的の出力が生成されます)。

ただし、ソース ファイルに変更を加えてコンパイルすると、次のエラーが発生します。

The SBT builder crashed while compiling your project. 
Native Library scalaz3.dll already loaded in another classloader.

ScalaIDE が別のクラスローダーを生成し、同じプロセスでプラグイン クラスをロードしようとしているようです。

コンパイラ プラグインのテスト ケースで同じ問題に直面していました。ただし、で使用して修正しfork in Test := trueましたbuild.sbt。しかし、Eclipse scala IDEで修正する方法についてはわかりません。

関連する投稿をいくつか紹介します (ただし、Eclipse scala ide とは関係ありません)。

4

1 に答える 1

2

IDE はインプロセスで sbt を使用するため、フォークに相当するものはありません。たとえば、 のコンストラクター内で dll をロードするなどして、dll を 1 回だけロードできませんでしたobjectか?

テクニックはここで提案されています:

呼び出すSystem.loadLibrary(String)クラスは、Web アプリケーション自体の再読み込みの影響を受けないクラスローダーによって読み込まれる必要があります。

したがって、次のような静的初期化子を含める規則に従う JNI コードがあるとします。

class FooWrapper {
    static {
        System.loadLibrary("foo");
    }

    native void doFoo(); 
} 

[...]

于 2012-07-02T15:13:53.753 に答える