Bundle native dépendances dans l'exécutable .jar avec Maven
J'ai un projet géré en Maven qui a une certaine natif dépendances (LWJGL).
Tout fonctionne bien dans le développement, mais maintenant je veux configurer Maven pour qu'il fera construire un exécutable .fichier jar que je peux redistribuer. En particulier, je veux qu'il soit très facile pour les utilisateurs d'exécuter l'application sans avoir à perdre avec une bibliothèque des chemins ou le déballage des bibliothèques natives etc.
Actuellement, je suis en mesure de construire une .fichier jar qui contient toutes les dépendances, mais si je le lance ensuite (sans surprise) je suis un insatisfait erreur de lien:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no lwjgl in java.libr
ary.path
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at org.lwjgl.Sys$1.run(Sys.java:73)
at java.security.AccessController.doPrivileged(Native Method)
at org.lwjgl.Sys.doLoadLibrary(Sys.java:66)
at org.lwjgl.Sys.loadLibrary(Sys.java:95)
at org.lwjgl.Sys.<clinit>(Sys.java:112)
at org.lwjgl.opengl.Display.<clinit>(Display.java:132)
at glaze.TestApp.start(TestApp.java:10)
at glaze.TestApp.main(TestApp.java:31)
Évidemment, je peux le faire fonctionner en installant manuellement les bibliothèques natives et l'exécution du pot avec java -Djava.library.path=/path/to/libs
mais ce n'est pas quelque chose que je peux attendre de mes utilisateurs à faire.
Voici l'pom.xml dans le cas où il est pertinent: https://github.com/mikera/glaze/blob/master/pom.xml
Il est possible de configurer Maven pour qu'il permettra de créer un exécutable .jar qui comprend le natif de dépendances et exécuté avec succès lors d'un double-cliqué?
- Quel est le problème exactement? Pouvez-vous montrer des exemples qui ne fonctionnent pas comme prévu?
- Aucun OS je sais de poignées de pot (ou zip) des fichiers comme équivalent aux systèmes de fichiers. De sorte que vous aurez besoin d'extraire une bibliothèque native avant de le charger.
- Dans le passé, j'ai installé pour l'assemblage d'un POT - séparé de ses ressources - et notamment d'un script de démarrage qui définit le nécessaire propriétés du système (c'est à dire au point de
java.library.path
à laresources
répertoire).
Vous devez vous connecter pour publier un commentaire.
C'est un code que j'utilise pour charger
dll
ouso
bibliothèques qui sont regroupés dans le pot.Les bibliothèques doivent être ajoutés en tant que ressources. Nous avons utilisé maven et les mettre dans cette hiérarchie:
Les bibliothèques partagées seront décompressés dans le tmp-répertoire pour la plate-forme et aussi d'avoir un nom temporaire lors de l'unpacked. C'est pour plusieurs processus de chargement de la dll/sans partage de la réelle extrait dll/ce, depuis le déballage pourrait remplacer celles existantes si le fait d'avoir le même nom (avec un comportement très étrange sur certaines plates-formes lorsque le fichier a été remplacé).
Le fichier est également configuré pour n'avoir
deleteOnExit
ensemble mais qui ne fonctionne pas sur windows autant que je sache.NativeLoader.java
Les bibliothèques sont chargées par la création d'une instance de la
NativeLoader
puis en appelantloadLibrary("thelibrary")
sans os, des préfixes et des extensions.Cela a bien fonctionné pour nous, mais vous devrez ajouter les bibliothèques partagées manuellement les différents répertoires de ressources et ensuite construire le pot.
Je me rends compte que peu de code dans cette classe peut être étrange ou obsolètes mais bare à l'esprit que c'est le code que j'ai écrit il y a quelques années et il a été très bien.
System.load
avant. Nice! J'allais écrire une réponse qui impliquait de manipuler lejava.library.path
(qui est ce qui est un exploit), mais vous n'avez pas besoin de le faire, parce que vous pouvez simplement charger le fichier directement.Avez-vous essayé d'utiliser
maven-assembly-plugin
voici un exemple :Et pour les dépendances, vous souhaiterez peut-être utiliser
Bundle-NativeCode
dans votre fichier manifeste. Voir http://wiki.osgi.org/wiki/Bundle-NativeCode.Vous voudrez peut-être aussi d'avoir un coup d'oeil à la
maven-bundle-plugin
: http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html de la générer avec Maven.java -jar your_jar_with_deps.jar
commande ?Voici le plugin dont vous avez besoin dans votre
pom.xml
pour exécuter votre build avec le Paramètre d'exécution que vous avez mentionné:Puis exécutez votre LWJGL-Programme à l'aide de