2010-12-13 3 views
6

Un fichier JAR tiers que j'utilise tente de charger une bibliothèque native à l'aide de System.loadLibrary. Je pense que ce qui se passe est que l'une des bibliothèques en cours de chargement dépend d'une autre bibliothèque native. Pointage -Djava.library.path ne fonctionne pas correctement dans ce cas. Les instructions du site de l'application placent les dll dans le répertoire jre/bin, mais je pense que c'est une très mauvaise idée (surtout lorsque vous essayez de déployer sur des sites clients).Dépendances Java System.loadLibrary

Donc, cette question est vraiment 2 parties.

  1. Est-il logique que si un essaie lib natif de charger une autre lib native -Djava.library.path ne fonctionne pas?

  2. Existe-t-il une bonne solution pour contourner ce problème? Je suppose que je pourrais appeler explicitement System.loadLibrary sur toutes les DLLs (je ne suis même pas sûr que cela fonctionnerait), mais je devrais m'assurer de les appeler dans le bon ordre sinon j'aurais le même problème.

EDIT: Je pense que cela est logique que cela se produit, et la meilleure solution que je l'ai lu jusqu'à présent est d'utiliser marcheur de dépendance pour le comprendre et de les charger dans l'ordre inverse ... mais je « m ouvert à de meilleures suggestions ...

grâce, Jeff

Répondre

4

Oui, il est logique que les bibliothèques natives ne pas utiliser la propriété Java -Djava.library.path liens vers d'autres bibliothèques natives.

Quelques approches possibles:

  • Le pot tiers est fixé à charger ses propres dépendances, en se fondant sur java.library.path.
  • Votre code charge les DLL requises par le fichier tiers dans un tri topographique inverse. Cependant, cela fait que votre code spécifie les dépendances du fichier tiers. Ces dépendances peuvent changer.
  • Vous utilisez le chemin de recherche DLL spécifique au système d'exploitation (par exemple, en utilisant LD_LIBRARY_PATH sous Unix/Linux/Mac ou PATH sous Windows). Cependant, cela peut nécessiter un script de démarrage.
+1

J'ai essayé de charger dans le tri inverse, et cela fonctionne, donc peut-être que je vais utiliser cette approche, à moins qu'il y ait une solution magique qui me manque. –

+0

C'est probablement ce que je ferais aussi, en plus de soumettre peut-être un défaut au tiers. Si vous utilisez un logiciel multiplateforme, les bibliothèques liées dynamiquement peuvent différer d'une plateforme à l'autre. Bonne chance! –