Comment ajouter une bibliothèque native à «java.library.path» avec le lancement d'Eclipse (au lieu de la remplacer)

90

J'ai une bibliothèque native qui doit être ajoutée à java.library.path . Avec l'argument JVM -Djava.library.path = path ... je peux définir le chemin comme je veux.

Mon problème est que mon autre bibliothèque (rapport pentaho) recherche les polices en fonction du chemin par défaut java.library.path (y compris les répertoires système, etc.) et le paramètre manuel remplace le chemin par défaut.

Alors: comment puis-je ajouter une entrée de chemin au chemin par défaut java.library.path au lieu de le remplacer (ce qui semble être fait avec -Djava.library.path)? (Je ne voudrais pas ajouter le chemin par défaut à la main, ce qui ne serait pas bien pour le déploiement)

EDIT: Désolé pour les détails manquants; Je travaille avec Eclipse. (Le déploiement se fait avec JNLP et là je peux utiliser nativelib sous ressources )

Touko
la source
1
pls voir la réponse acceptée pour cette question à la place - pour moi c'est beaucoup mieux: stackoverflow.com/questions/957700/…
laher
La question "comment ajouter une bibliothèque native à .." prête à confusion. Il s'agit probablement d'ajouter (ajouter ou ajouter) un autre "chemin de bibliothèque", c'est-à-dire en supposant qu'Eclipse affiche quelque chose comme java.library.path = path1: path2: path3 par défaut, la question est de savoir comment démarrer Eclipse se terminant dans java.library .path = my / lib / folder: path1: path2: path3
whaefelinger

Réponses:

46

J'avais oublié ce problème ... Je demandais en fait avec Eclipse, désolé de ne pas l'avoir dit à l'origine. Et la réponse semble trop simple (au moins avec 3.5; probablement avec les anciennes versions aussi):

Arguments de la configuration d'exécution Java: arguments VM:

-Djava.library.path="${workspace_loc:project}\lib;${env_var:PATH}"

Il ne faut pas oublier les guillemets, sinon il y a des problèmes d'espaces dans PATH.

Touko
la source
7
S'il y a deux bibliothèques partagées, l'une dépendante de l'autre, cela ne fonctionnera pas. Le premier est trouvé par le runtime Java, mais le second est résolu par le chargeur dynamique du système. La seule solution que j'ai trouvée est de définir LD_LIBRARY_PATH.
kevin cline
4
La réponse donnée par @Touko ne correspond pas à la question d'origine qui concerne l'ajout ou l'ajout d'un dossier de bibliothèque natif. Au moins sur Mac OS 10.8, ni $ PATH, ni $ LD_LIBRARY_PATH ni $ {workspace_loc: project} \ lib n'ont quelque chose à voir avec la valeur par défaut. Par exemple, sur mon Mac, la valeur par défaut est $ HOME / Library / Java / Extensions: / Library / Java / Extensions: / Network / Library / Java / Extensions: / System / Library / Java / Extensions: / usr / lib / java :.
whaefelinger le
Si vous utilisez TestNG dans Eclipse, vous devrez modifier la configuration d'exécution de TestNG: - Dans la fenêtre Configurations d'exécution, sélectionnez votre configuration TestNG cible. - Sélectionnez l'onglet Environnement - Ajoutez une variable PATH et définissez sa valeur sur votre cible - Laissez le bouton par défaut "Ajouter l'environnement à l'environnement natif".
Philippe
Puis-je avoir un exemple.
basickarl
@kevincline pourriez-vous expliquer pourquoi exactement cela ne fonctionnera pas dans ce cas? Je viens de rencontrer ce problème et j'essaie de comprendre ce qui ne va pas avec cette solution.
anula
14

Si vous souhaitez ajouter une bibliothèque native sans interférer avec java.library.pathau moment du développement dans Eclipse (pour éviter d'inclure des chemins absolus et d'avoir à ajouter des paramètres à votre configuration de lancement), vous pouvez fournir le chemin d'accès à l'emplacement des bibliothèques natives pour chaque Jar dans Java Build Boîte de dialogue Chemin sous Emplacement de la bibliothèque native . Notez que le nom du fichier de la bibliothèque native doit correspondre au nom du fichier Jar. Voir également cette description détaillée .

Fabian Steeg
la source
3
-1. Vous supposez que l'utilisateur final exécute l'application à partir d'un IDE, ce qui est peu probable.
finnw
@finnw Je comprends votre point. J'ai trouvé la question à la recherche d'une solution sur la façon d'ajouter une bibliothèque native dans l'EDI pendant le développement, sans la redéfinir java.library.pathet je suis revenue après avoir trouvé la solution ailleurs. Je modifierai ma réponse pour que cela soit plus clair.
Fabian Steeg
En fait, je travaille avec Eclipse même si je ne l'ai pas mentionné à la question.
Touko
En fait, cela ne fonctionne pas dans la version actuelle d'Eclipse (Luna) car la définition de la propriété remplace java.library.path comme l'utilisateur le décrit comme étant un problème dans la question.
Alex N.12
9

SWT place les DLL natives nécessaires dans un JAR. Recherchez "org.eclipse.swt.win32.win32.x86_3.4.1.v3449c.jar" pour un exemple.

Les DLL doivent être à la racine du JAR, le JAR doit être signé et la DLL doit apparaître avec la somme de contrôle dans META-INF / MANIFEST.MF pour que la VM les récupère.

Aaron Digulla
la source
2
Comment puis-je le faire avec NetBeans?
Maciek Sawicki
AFAIK, NetBeans utilise Ant pour construire le projet. Lisez la documentation pour Ant comment créer des JAR signés et comment mettre des éléments tels que des DLL dans le manifeste.
Aaron Digulla
Comment le configurer pour ajouter le .dll, dans Eclipse?
NoBugs
@NoBugs: Dans Eclipse, ce post devrait aider: eclipsezone.com/eclipse/forums/t49342.html
Aaron Digulla
@AaronDigulla suggérez-vous que la DLL puisse toujours être attachée de cette manière? Je pensais qu'il ne cherchait que quelque chose comme java.library.path. Proposez-vous qu'il ne recherche que la racine de jar?
4

Sous Windows, comme ceci:

-Djava.library.path = "C: / MyLibPath;% PATH%"

% PATH% est votre ancien -Djava.library.path

Andy boot
la source
J'ai essayé cette idée mais cela a abouti à java.library.path: D: \ Workspace \ myProject \ lib;% PATH%
Touko
Vous pouvez également utiliser $ {system_property: java.library.path}
Rob Elsner
2
La valeur par défaut sous UNIX / Mac / GNU Linux est LD_LIBRARY_PATH. PATH est une chose Windows.
whaefelinger
2

Pouvez-vous contourner cela en appelant System.load () par programme pour charger votre bibliothèque native? Cette méthode (contrairement à System.loadLibrary () ) vous permet de spécifier un chemin absolu.

Simon Nickerson
la source
1
Veuillez expliquer comment vous appelleriez System.load () par programme lors du lancement d'Eclipse?
whaefelinger le
2

https://bugs.eclipse.org/bugs/show_bug.cgi?id=102239 indique qu'il n'y a pas de mécanisme de substitution implémenté dans le lanceur d'Eclipse, du moins pas jusqu'à la sortie de Juno.

Ainsi, il est (presque) impossible d'ajouter ou de préfixer un autre dossier de bibliothèque à java.library.path lors du lancement d'Eclipse sans connaissance préalable du paramètre par défaut.

J'ai presque écrit, car il devrait être possible de laisser démarrer Eclipse, de vider le contenu de java.library.path et d'arrêter Eclipse en une seule commande. Le vidage serait analysé puis pris comme entrée pour le lancement d'Eclipse, c'est-à-dire

#!/bin/bash
# get default value of java.library.path (somehow)
default_lib_path=$( start_dump_stop_eclipse_somehow )  

# now launch Eclipse
eclipse --launcher.appendVmargs \
         -vmargs \
         -Djava.library.path="/my/native/lib/folder:${default_lib_path}"
whaefelinger
la source
1

Dans les systèmes UNIX, vous pouvez ajouter à la variable d'environnement LD_LIBRARY_PATH. Sous Windows, la JVM définit automatiquement la propriété système, java.library.path, sur PATH; donc si la dll est sur votre PATH, alors vous êtes prêt.

geowa4
la source
Le fil de départ était très précis sur la façon d '«ajouter» un deuxième dossier de bibliothèque natif, n'est-ce pas?
whaefelinger
@ user667073 J'ai dit la même chose ... APPENDING est la question, le thread-starter sait déjà comment charger une lib partagée autrement ;-)
Ustaman Sangat
STS 3.4.0 et Mac OS 10.8: les paramètres de LD_LIBRARY_PATH n'ont aucun impact sur java.library.path. J'ai testé cela avec Subclipse / JavaHL. Celui-ci a fonctionné: STS --launcher.appendVmargs -vmargs -Djava.library.path = / opt / local / lib lors de l'exportation LD_LIBRARY_PATH = / opt / local / lib; Le STS était négatif.
whaefelinger
1

Fenêtre-> Préférences-> Java-> JRE installés. Choisissez ensuite votre JRE (JDK) actuel et cliquez sur Modifier. Remplissez les arguments VM par défaut: -Djava.library.path = / usr / local / xuggler / lib. Terminé!

Vadym
la source
1
Cette réponse est inutile car le thread starter demande spécifiquement "Comment ajouter une bibliothèque native [..] au lieu de surcharger [..]". Cette réponse remplace simplement le paramètre par défaut.
whaefelinger
1

La solution proposée par Rob Elsner dans l'un des commentaires ci-dessus fonctionne parfaitement (OSX 10.9, Eclipse Kepler). Il faut ajouter leurs chemins supplémentaires à ceux séparés par ":".

Vous pouvez également utiliser $ {system_property: java.library.path} - Rob Elsner 22 novembre 2010 à 23:01

Johan
la source
0

Le nom du fichier de la bibliothèque native doit correspondre au nom du fichier Jar. C'est très très important. Veuillez vous assurer que le nom du jar et le nom de la DLL sont identiques. Veuillez également consulter le message de Fabian Steeg. Mon téléchargement pour jawin contenait différents noms pour dll et jar. C'était jawin.jar et jawin d .dll, notez un «d» supplémentaire dans le nom du fichier dll. Je l'ai simplement renommé en jawin.dll et l'ai défini comme bibliothèque native dans eclipse comme mentionné dans le post " http://www.eclipsezone.com/eclipse/forums/t49342.html "

Dhana
la source
La question concerne l'ajout d'une bibliothèque native (dossier) au lancement d'Eclipse.
whaefelinger
0

Pour une raison quelconque, je ne pouvais pas faire fonctionner plusieurs dossiers (eh bien, cela a fonctionné pendant un certain temps, mais dès que j'ai eu besoin de plus de dll et ajouté plus de dossiers, aucun avec des espaces blancs dans le chemin). J'ai ensuite copié toutes les dll nécessaires dans un dossier et je l'ai utilisé comme java.library.path et cela a fonctionné. Je n'ai pas d'explication - si quelqu'un le fait, ce serait génial.

Ustaman Sangat
la source
Eh bien, si une bibliothèque native est trouvée via java.library.path et que vous en copiez une autre dans ce dossier, alors il semble naturel que la seconde soit également trouvée, n'est-ce pas?
whaefelinger
Bien sûr, c'est pourquoi j'ai utilisé ça, duh! Ce que je me demandais, c'était si on pouvait y ajouter plusieurs dossiers sans avoir à déplacer ou à créer des liens symboliques.
Ustaman Sangat
0

La plupart des réponses existantes supposent que vous souhaitez définir cela pour un projet particulier, mais je devais le définir pour Eclipse lui-même afin de prendre en charge l'authentification intégrée pour le pilote JDBC SQL Server.

Pour ce faire, j'ai suivi ces instructions pour lancer Eclipse à partir de la ligne de commande Java au lieu de son lanceur normal. Ensuite, je viens de modifier ce script pour ajouter mon argument -Djava.library.path à la ligne de commande Java.

CrazyPyro
la source
0
  1. Sous Windows: ajoutez le chemin de la bibliothèque à la variable d'environnement PATH.
  2. Sous Linux: ajoutez le chemin de la bibliothèque à la variable d'environnement LD_LIBRARY_PATH.
  3. Sur Mac: ajoutez le chemin de la bibliothèque à la variable d'environnement DYLD_LIBRARY_PATH.

java.library.path est initialisé avec les valeurs des variables ci-dessus sur sa plateforme correspondante.

Cela devrait fonctionner sur n'importe quel IDE.

Vous pouvez tester si la valeur est ce que vous attendez en appelant java -XshowSettings:properties

rboc
la source
-2

Sous Windows, j'ai trouvé que l'important est de démarrer Eclipse à partir de la ligne de commande plutôt qu'à partir du menu Démarrer ou d'un raccourci, à condition que la DLL native se trouve dans un répertoire de votre PATH. Apparemment, cela garantit que le répertoire approprié est sur le chemin.

Alan
la source
Corrigez-moi si je me trompe mais je pense que le répertoire de travail actuel sur Windows est automatiquement inclus lors de la recherche de DLL (ou de binaires exécutables). Ainsi, lorsque vous passez dans le dossier où se trouvent les DLL et que vous démarrez ensuite Eclipse, alors oui, les DLL que vous recherchez sont trouvées. En dehors de cela, comment cette réponse est-elle liée à la question des lanceurs de fil?
whaefelinger