Comment combiner la bibliothèque avec mon pot?
Ok, donc j'ai écrit un programme qui permet d'utiliser une 3ème partie de la bibliothèque open source et je veux le paquet avec mon programme dans un seul pot. Je suis à l'aide de netbeans 6.8 et tout ce que j'ai essayé de java toujours cracher arrière de l'erreur:
java.lang.NoClassDefFoundError: libraryname;
hors sujet:aussi, je voudrais savoir comment faire un exécutable jar(exe) par le biais de netbeans si c'est possible. (j'ai vu des programmes qui ont été écrits en java, mais en avait été un .exe)
MODIFIER découvert un plugin pour eclipse appelé FatJar qui peut faire ce que je veux, mais je ne peux pas trouver quelque chose de similaire pour netbeans, est-il une telle chose?
Votre question hors-sujet est répondu par stackoverflow.com/questions/2011664/... ... sauf que je ne pense pas que vous pouvez faire cela avec netbeans.
c'est probablement un doublon de la question stackoverflow.com/questions/81260/....
c'est probablement un doublon de la question stackoverflow.com/questions/81260/....
OriginalL'auteur Dacto | 2010-01-07
Vous devez vous connecter pour publier un commentaire.
Je commence avec l'avertissement obligatoire: exécutable Java Pots ne fonctionnent pas de cette façon. Un exécutable JAR dispose d'une classe définie dans le POT MANIFESTE.MF fichier, et le MANIFESTE permet également la définition d'un chemin de classe pour inclure les bibliothèques que le code de l'exécutable JAR aurez besoin. La classe de définition du chemin d'accès dans le MANIFESTE doit énumérer chaque BOCAL ou un dossier pour mettre sur le chemin de classe, les chemins relatifs sont relatifs à l'emplacement de l'exécutable JAR - pas de chemins de contenus à l'intérieur de l'exécutable JAR. Exécutable Pots sont lancé avec l'option "-jar" l'argument de l'exécutable java, et à la fois la java-cp" drapeau et la variable d'environnement CLASSPATH sont ignoré. Quant à savoir pourquoi exécutable Pots ont été conçues de cette manière, vous devez être conscient de le principal inconvénient de chargement de classes à partir de Pots de contenus dans des Bocaux, même si le reste de cette réponse mettra l'accent sur le fait que cela.
REMARQUE: j'ai perdu l'original de soleil sur le forum qui explique entièrement, mais essentiellement, c'est parce que les entrées dans le top niveau JAR peut être lu dans un accès aléatoire façon, mais l'ensemble de l'JAR intégrés doivent être lues avant toute inscription peut être consulté, parce que le haut niveau de POT peut avoir compressé ses entrées.
J'ai utilisé Un Bocal avec succès dans le passé, mais la structure de la finale pot peut ne pas être ce que vous attendez. Essentiellement, le " One-Pot classes sont les seuls non-JARd classes dans le dernier pot; tous les autres codes (le code, et tout dépendant de la bibliothèque de code) est inclus dans le résultat de ce que le POT dans des fichiers JAR. Votre demande est JARed régulier JAR fichier nommé "main.jar" dans le dernier POT de la "main" du dossier. Les bibliothèques votre code est placé, comme les fichiers JAR, dans le dernier POT "lib" du dossier. Et le dernier mais non le moins, la dernière POT MANIFESTE.MF fichier indique Un Pot de ce que votre classe principale. L'exécution est un simple morts "java-jar final.jar [args votre application utilise l']". Je ne sais pas comment faire pour passer à la prochaine étape de la conversion à un système d'exploitation natif EXE concernant votre question hors-sujet, mais il serait sans doute préférable d'utiliser un autre mécanisme de packaging qu'Un Pot de toute façon. Je ne suis pas sûr de savoir comment aller à ce sujet avec NetBeans, à mon avis il y a à utiliser un outil de construction du forfait pour la finale du pot. Heureusement, Un Pot fournit des instructions sur la création de la finale pot avec Ant, et qui devrait être facilement intégrable dans NetBeans.
Je crois que l'Éclipse FatJar plugin crée un Jar exécutable JAR, de sorte que si ce plugin semble faire ce que vous voulez, puis d'Un Pot est la façon de le faire. Personnellement, j'ai utilisé un Maven assembly.
Il y a un bémol - signés bibliothèques qui exigent (ou le désir) de prendre avantage de Java est signé POT de vérification peut ne pas fonctionner de cette façon - Java Cryptographiques Extension (JCE) implémentations comme BouncyCastle sont un exemple notable. Je pense que la raison en est que la vérification de la signature va à l'encontre de la finale de POT, non signé de la bibliothèque. Heureusement, Un Pot permet à l'utilisateur d'ajouter d'autres bibliothèques dans le chemin, quelque chose qui est explicitement exclue lors de l'exécution d'un fichier exécutable JAR; pour contourner cela, vous pourriez être mieux de la livraison de la problématique des Bocaux avec le dernier POT et un OS dépendante de lancement de script (.chauve-souris, .sh, etc).
OriginalL'auteur beltorak
Je me rends compte que ce n'est pas d'obtenir exactement ce que vous voulez, mais je vais vous décrire la méthode habituelle de la distribution d'une application autonome. Si elle ne répond pas à vos besoins, vous trouverez que c'est mieux pris en charge par des outils et plus facilement compréhensible par les utilisateurs, car il suit les conventions établies.
Mettre votre code dans un bocal (je vais l'appeler
app.jar
) avec unMETA-INF/MANIFEST.MF
fichier avec des entrées comme ceci:Ensuite, vous pouvez jeter tous les bocaux dans un répertoire et exécuter
AppMain
comme ceci:Si vous le souhaitez, vous pouvez mettre les bibliothèques de tiers dans un seul répertoire comme
lib
et de vous y référer dans leClass-path
attribut à l'aide d'un chemin d'accès relatif à la principale jar:lib/third-party.jar
Qui aide à garder votre distribution ordonnée.OriginalL'auteur erickson
Mon générique de réponse à votre question hors-sujet est un (plutôt longue) de l'article: Convertir Java EXE - Pourquoi, Quand, Lorsqu'il n'est Pas et Comment. Elle a beaucoup de liens vers libres et des outils commerciaux, mais je n'ai jamais vu un plugin Netbeans avec une telle fonctionnalité, désolé.
Je vous remercie beaucoup. C'est génial.
OriginalL'auteur Dmitry Leskov
Pour inclure un autre pot dans votre bocal, vous pouvez trouver jarjar utile.
Exécutable pots juste une classe définie comme "Main", si je ne me trompe pas. Cela peut être utile.
OriginalL'auteur Conrad Meyer
Cela a été un excellent guide et vraiment fait ce que je voulais, sans cacher les mains dans tous ces 3ème partie libs.
http://java.sun.com/developer/technicalArticles/java_warehouse/single_jar/
OriginalL'auteur Hiro2k
Si il n'y a pas de souci de reconditionnement 3ème partie bocaux dans votre finale de grand bocal, puis cette devrait être la méthode la plus simple.
OriginalL'auteur bryantsai
Si il n'y a pas
licencing issues
la plus préférée moyen est de unjar le réel bocal et rejar avec vos fichiers de classe, à un nouveau pot.Vous pouvez simplement utiliser la pot cmd lui-même pour cela, pas grand-chose!!
Je suis en désaccord. C'est (peut-être) simple pour le développeur, mais c'est un obstacle pour les utilisateurs qui ont besoin de remplacer la troisième partie de la bibliothèque avec une version différente. C'est pourquoi beaucoup de licences open source décourager / limiter / interdire ce genre d'intégration!!
Ok, alors im retour au lieu d'origine 🙂
Je parle de la pratique de la unjaring la 3ème partie pots de mélange et de leur contenu avec vos classes de l'application. En revanche, la simple intégration de la 3ème partie pots dans votre bocal est plus casher.
Oui je sais ce que tu ment, je suis inconscient de l'intégration de la 3e partie bocal et toujours mon programme fonctionne comme il le doit.
OriginalL'auteur Suraj Chandran
si vous utilisez MAVEN, utiliser "maven-ombre-plugin" plugin. Compiler pot avec toutes les dépendances(3e partie et etc.)
OriginalL'auteur Azat Nugusbayev