Est-il possible de regrouper toutes les dépendances jar dans un grand pot?
Je sais que ce n'est pas de "meilleure pratique", mais puis-je inclure toutes les dépendances dans un grand bocal?
source d'informationauteur Geo
Vous devez vous connecter pour publier un commentaire.
Il y a un utilitaire appelé Un Bocal qui fait ce que vous voulez, mais je vous le déconseille. La performance est généralement terrible.
Mon sentiment est que l'appel à Un Pot de performance terrible et les pauvres est injuste. Pour la taille modérée de l'application, on peut s'attendre de démarrage prendra quelques secondes de plus (ce qui n'affecte pas la JVM de l'écran de démarrage). Surcharge de la mémoire de dizaines de méga-octets est négligeable pour la plupart des environnements, à l'exception peut-être des systèmes embarqués. Aussi, Un Pot est capable de extrayant automatiquement certains fichiers du système de fichiers, ce qui économise de la nécessité de développer un programme d'installation dans mon cas.
Ci-dessous est une tentative de quantifier l'impact sur les performances introduit par Un Pot à ma demande. C'est Balancer de l'interface utilisateur sur l'application, se compose de 352 classes d'obfuscation avec ProGuard 4.5b2. Un Pot de 0,96 est utilisé pour regrouper des classes obtenues avec 12 MO de dollars de bibliothèques (ODFDOM, Saxon IL, Xerces, Jaxen, VLDocking, Apache Commons, etc). J'ai comparé les performances de l'obfuscation pot avec le même pot traitées par Un Pot.
Le calendrier ci-dessus a été obtenue en prenant un timestamp juste avant le démarrage de la JVM de shell Linux, en début de méthode main (), et dans windowOpened() du gestionnaire d'événement de ma fenêtre de l'application. Les mesures ont été prises sur un pas particulièrement rapide, D820, ordinateur portable, dual core cadencé à 1 ghz et 2G de RAM sous Ubuntu 8.04.
Espère que cela aide.
J'ai utilisé maven assembly plugin avec jar-with-dependencies descripteur
En utilisant la bonne vieille Fourmi: il suffit d'utiliser
zipgroupfileset
avec la Fourmi Zip tâcheCela va aplatir tous inclus jar contenu des bibliothèques.
Un BOCAL en charge toutes les dépendances des pots en mémoire au démarrage. Cela peut sembler horriblement inefficace, mais personne ne s'est plaint à moi, à ce sujet, puisqu'il a été publié en 2004. L'effet probable de la pré-charge est à une vitesse globale de classloading pour l'application, depuis le chargeur de classe n'a pas balayer à plusieurs reprises le chemin de ressources et des classes que l'application s'exécute: tout est hashmapped.
C'est assez simple à construire un paresseux chargeur qui charge sur demande: mais je suis de l'école qui dit "build-il, sur mesure, d'améliorer, si nécessaire" et jusqu'à présent il n'y a pas besoin de l'améliorer.
Je vais garder cela à l'esprit pour les prochaines versions (ou si quelqu'un d'autre veut s'y attaquer, ce serait très bien aussi, car, sans une très grande application pour mesurer contre, il est difficile de savoir si les changements sont les améliorations).
Si vous voulez faire cela, il existe un outil appelé Jar Jar Liens qui va le faire pour vous. Jamais utilisé, mais il est difficile d'oublier le nom.
Vous pouvez unjar fichiers et de les emballer à l'aide de la ligne de commande
Vous pouvez utiliser [uberjar]
Vous pouvez utiliser fatjar
Souvent, vous pouvez, mais il y a parfois insolites juridique ou technique raisons de ne pas.
Juridique: Par exemple, nous avons découvert qu'à l'époque, nous voulions, nous ne pourrions regrouper les JavaMail jar fichiers ensemble dans un gros paquet avec le reste de notre application, mais le contrat de licence dit que nous avions de les garder séparés.
Technique: un Autre problème peut être personnalisé en classe chargeurs spécifiques de ressources ou de classes à l'intérieur de certains fichiers jar. Cela arrive souvent dans le contexte de conteneurs pour les serveurs d'applications ou de l'ESBs.
Comment: Pour le faire, juste unjar le tout dans un répertoire, puis de recréer un pot à partir de là. Vous pourriez avoir à modifier certains paramètres dans le répertoire META-INF de supprimer les requêtes de chargement supplémentaires pots, et pour gérer le cas où les différents pots ont chacun une classe par défaut à exécuter. Il y a quelques utilitaires tiers qui pourrait aider, mais sauf si vous savez ce ils sont en train de faire, vous voulez être prudent.
Eclipse 3.4 et vous permet de faire cela. Cliquez-droit sur votre projet, sélectionnez Extraire, et accédez à la Runnable Jar option. Sélectionnez Suivant. Choisissez les paramètres appropriés et votre parti. Aussi il me semble que cette fonctionnalité est réalisée à l'aide de la même ou similaire bibliothèques FatJar (mentionné ci-dessus).
Juste pour être complet, ProGuard va le faire pour vous, ainsi qu'éventuellement d'obscurcir et de la réduction des Bocaux. La dernière fonction est particulièrement utile pour la création de déploiement final Pots.
Souvenez-vous également que .les fichiers jar sont .les fichiers zip sous les couvertures. Vous pouvez utiliser votre favori zip outils pour (re)package. Dans ce cas, vous avez à traiter avec le fichier de manifeste de vous-même.