2 votes

Chargement de la bibliothèque native dans le plugin de compilateur Scala

Je suis en train de développer un plugin compilateur scala. Le plugin compilateur s'exécute après la phase "refcheck". Il analyse l'AST (Arbre Syntaxique Abstrait) et génère une certaine sortie. Dans ce plugin, je charge une bibliothèque native "scalaz3.dll" en utilisant System.loadLibrary

Je prévois d'utiliser le plugin compilateur avec l'Eclipse Scala IDE. Je définis le paramètre -XPlugin dans les préférences de ScalaIde. Lorsque je compile un fichier source scala dans Eclipse, le plugin est invoqué après la phase refchecks et fonctionne bien (il génère la sortie désirée)

Cependant, lorsque je fais des modifications au fichier source et que je compile, je reçois l'erreur suivante.

Le constructeur SBT a planté lors de la compilation de votre projet. 
La bibliothèque native scalaz3.dll est déjà chargée dans un autre classloader.

Il semble que ScalaIDE génère un autre classloader et tente de charger les classes du plugin dans le même processus.

J'ai rencontré le même problème dans le cas de test du plugin compilateur. Cependant, je l'ai corrigé en utilisant fork in Test := true dans le build.sbt. Mais je suis perplexe sur la façon de le corriger dans eclipse scala IDE.

Voici quelques articles connexes (bien que non liés à l'Eclipse Scala IDE) :

2voto

Iulian Dragos Points 3298

L'IDE utilise sbt en interne, il n'y a donc pas d'équivalent de forking. Ne pourriez-vous charger le dll une seule fois, par exemple en le chargeant à l'intérieur du constructeur d'un object ?

La technique est suggérée ici:

La classe qui appelle System.loadLibrary(String) doit être chargée par un classloader qui n'est pas affecté par le rechargement de l'application web elle-même.

Ainsi, si vous avez du code JNI qui suit la convention d'inclure un initialiseur statique comme ceci:

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

    native void doFoo(); 
} 

[...]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X