Maven2 me rend fou pendant la phase d'expérimentation / de maquette rapide et sale du développement.
J'ai un pom.xml
fichier qui définit les dépendances du framework d'application web que je veux utiliser, et je peux générer rapidement des projets de démarrage à partir de ce fichier. Cependant, parfois, je veux pom.xml
créer un lien vers une bibliothèque tierce qui n'a pas encore de fichier défini, donc plutôt que de créer le pom.xml
fichier pour la bibliothèque tierce à la main et de l'installer, et d'ajouter la dépendance à ma pom.xml
, je voudrais juste pour dire à Maven: "En plus de mes dépendances définies, incluez tous les pots qui s'y trouvent /lib
également."
Il semble que cela devrait être simple, mais si c'est le cas, il me manque quelque chose.
Tous les conseils sur la façon de procéder sont grandement appréciés. En dehors de cela, s'il existe un moyen simple de pointer maven vers un /lib
répertoire et de créer facilement un pom.xml
avec tous les pots joints mappés sur une seule dépendance que je pourrais ensuite nommer / installer et lier à un seul coup suffirait également.
Réponses:
Problèmes des approches populaires
La plupart des réponses que vous trouverez sur Internet vous suggéreront d'installer la dépendance dans votre référentiel local ou de spécifier une étendue "système" dans le
pom
et de distribuer la dépendance avec la source de votre projet. Mais ces deux solutions sont en fait imparfaites.Pourquoi vous ne devriez pas appliquer l'approche "Installer sur le référentiel local"
Lorsque vous installez une dépendance dans votre référentiel local, elle y reste. Votre artefact de distribution fonctionnera bien tant qu'il aura accès à ce référentiel. Le problème est que dans la plupart des cas, ce référentiel résidera sur votre machine locale, il n'y aura donc aucun moyen de résoudre cette dépendance sur une autre machine. Clairement, faire dépendre votre artefact d'une machine spécifique n'est pas un moyen de gérer les choses. Sinon, cette dépendance devra être installée localement sur chaque machine travaillant avec ce projet, ce qui n'est pas mieux.
Pourquoi ne pas appliquer l'approche "System Scope"
Les jars dont vous dépendez avec l'approche "System Scope" ne sont ni installés dans aucun référentiel ni attachés à vos packages cibles. C'est pourquoi votre package de distribution n'aura aucun moyen de résoudre cette dépendance lorsqu'il est utilisé. Je pense que c'est la raison pour laquelle l'utilisation de la portée du système a même été déconseillée. Quoi qu'il en soit, vous ne voulez pas vous fier à une fonctionnalité obsolète.
La solution de référentiel statique dans le projet
Après avoir mis cela dans votre
pom
:pour chaque artefact avec un identifiant de groupe de forme,
x.y.z
Maven inclura l'emplacement suivant dans le répertoire de votre projet dans sa recherche d'artefacts:Pour en savoir plus, vous pouvez lire cet article de blog .
Utilisez Maven pour installer le projet repo
Au lieu de créer cette structure à la main, je recommande d'utiliser un plugin Maven pour installer vos pots en tant qu'artefacts. Ainsi, pour installer un artefact dans un référentiel dans le projet sous
repo
dossier, exécutez:Si vous choisissez cette approche, vous pourrez simplifier la déclaration du référentiel
pom
pour:Un script d'aide
Étant donné que l'exécution de la commande d'installation pour chaque bibliothèque est un peu ennuyeuse et propice aux erreurs, j'ai créé un script utilitaire qui installe automatiquement tous les fichiers jars d'un
lib
dossier vers un référentiel de projet, tout en résolvant automatiquement toutes les métadonnées (groupId, artifactId et etc.) de noms des fichiers. Le script affiche également les dépendances xml que vous pouvez copier-coller dans votrepom
.Inclure les dépendances dans votre package cible
Lorsque vous aurez créé votre référentiel dans le projet, vous aurez résolu un problème de distribution des dépendances du projet avec sa source, mais depuis lors, l'artefact cible de votre projet dépendra de fichiers JAR non publiés, donc quand vous installerez vers un référentiel, il aura des dépendances insolubles.
Pour surmonter ce problème, je suggère d'inclure ces dépendances dans votre package cible. Vous pouvez le faire avec le plugin Assembly ou mieux avec le plugin OneJar . La documentation officielle sur OneJar est facile à saisir.
la source
Pour le code à jeter uniquement
définir le système scope == et créer simplement un groupId, un artifactId et une version
Remarque: les dépendances système ne sont pas copiées dans le fichier jar / war résultant
(voir Comment inclure les dépendances système dans war construit à l'aide de maven )
la source
system
portée est une pratique horrible qui est fortement déconseillée . Voir Dependency + Scopes .Vous pouvez créer un référentiel local sur votre projet
Par exemple, si vous avez un
libs
dossier dans la structure du projetDans le
libs
dossier, vous devez créer une structure de répertoires comme:/groupId/artifactId/version/artifactId-version.jar
Dans votre pom.xml, vous devez enregistrer le référentiel
et ajouter la dépendance comme d'habitude
C'est tout.
Pour des informations détaillées: comment ajouter des bibliothèques externes dans Maven
la source
Remarque: Lors de l'utilisation de l'étendue du système ( comme mentionné sur cette page ), Maven a besoin de chemins absolus.
Si vos fichiers jar sont sous la racine de votre projet, vous voudrez préfixer vos valeurs systemPath avec $ {basedir}.
la source
C'est ce que j'ai fait, cela fonctionne également autour du problème de package et cela fonctionne avec le code extrait.
J'ai créé un nouveau dossier dans le projet dans mon cas que j'ai utilisé
repo
, mais n'hésitez pas à utilisersrc/repo
Dans mon POM, j'avais une dépendance qui ne se trouve dans aucun référentiel Maven public
J'ai ensuite créé les répertoires suivants
repo/com/dovetail/zoslog4j/1.0.1
et copié le fichier JAR dans ce dossier.J'ai créé le fichier POM suivant pour représenter le fichier téléchargé (cette étape est facultative, mais elle supprime un AVERTISSEMENT) et aide le gars suivant à comprendre où j'ai obtenu le fichier pour commencer.
Deux fichiers facultatifs que je crée sont les sommes de contrôle SHA1 pour le POM et le JAR pour supprimer les avertissements de somme de contrôle manquants.
Enfin j'ajoute le fragment suivant à mon pom.xml qui me permet de faire référence au référentiel local
la source
Vous devez vraiment mettre en place un cadre via un référentiel et identifier vos dépendances à l'avance. L'utilisation de la portée du système est une erreur courante que les gens utilisent, car ils "ne se soucient pas de la gestion des dépendances". Le problème est que, ce faisant, vous vous retrouvez avec une construction de maven pervertie qui ne montrera pas le maven dans un état normal. Vous feriez mieux de suivre une approche comme celle-ci .
la source
Voici comment ajouter ou installer un pot local
j'ai donné quelques groupId et artifactId par défaut car ils sont obligatoires :)
la source
Le plugin d'installation Maven a une utilisation en ligne de commande pour installer un bocal dans le référentiel local, POM est facultatif mais vous devrez spécifier GroupId, ArtifactId, Version et Packaging (tous les éléments POM).
la source
L'utilisation
<scope>system</scope>
est une idée terrible pour des raisons expliquées par d'autres, l'installation manuelle du fichier dans votre référentiel local rend la construction non reproductible, et l'utilisation<url>file://${project.basedir}/repo</url>
n'est pas une bonne idée non plus car (1) qui peut ne pas être unefile
URL bien formée (par exemple si le projet est extrait dans un répertoire avec des caractères inhabituels), (2) le résultat est inutilisable si le POM de ce projet est utilisé comme dépendance du projet de quelqu'un d'autre.En supposant que vous n'êtes pas disposé à télécharger l'artefact dans un référentiel public, la suggestion de Simeon d'un module d'assistance fait le travail. Mais il existe maintenant un moyen plus simple…
La recommandation
Utilisez un plugin non maven-jar-maven . Fait exactement ce que vous demandiez, sans aucun des inconvénients des autres approches.
la source
J'ai trouvé une autre façon de le faire, voir ici à partir d'un post Heroku
Pour résumer (désolé pour certains copier-coller)
repo
répertoire sous votre dossier racine:pom.xml
:la source
Après avoir longuement discuté avec les gars de CloudBees au sujet du conditionnement correct de ce type de JAR, ils ont fait une bonne proposition de solution intéressante:
Création d'un faux projet Maven qui attache un JAR préexistant comme artefact principal, s'exécutant dans l'installation POM appartenue: exécution du fichier d'installation. Voici un exemple d'un tel kinf de POM:
Mais pour le mettre en œuvre, la structure existante du projet doit être modifiée. Tout d'abord, vous devez avoir à l'esprit que pour chaque type de JAR, il devrait être créé différents faux projets Maven (module). Et il devrait être créé un projet Maven parent comprenant tous les sous-modules qui sont: tous les wrappers JAR et le projet principal existant. La structure pourrait être:
Lorsque le parent s'exécute via mvn: install ou mvn: l'empaquetage est forcé et les sous-modules seront exécutés. Cela pourrait être considéré comme un inconvénient ici, car la structure du projet devrait être modifiée, mais offre une solution non statique à la fin
la source
Ce qui me semble le plus simple, c'est simplement de configurer votre plugin-compilateur maven pour inclure vos pots personnalisés. Cet exemple charge tous les fichiers jar dans un répertoire lib.
la source
says nothing to complile
!all classes are up to date
nothing to compile
parce qu'il ne cherchera*.java
plus. Vous pouvez les rajouter en utilisant<include>**/*.java</include>
. Pourtant, pas de succès pour moi pour les potsLe problème
systemPath
est que les pots des dépendances ne seront pas distribués le long de vos artefacts en tant que dépendances transitives. Essayez ce que j'ai publié ici: est-il préférable de Mavenize vos fichiers jar de projet ou de les mettre dans WEB-INF / lib?Déclarez ensuite les dépendances comme d'habitude.
Et veuillez lire la note de bas de page.
la source
Une étrange solution que j'ai trouvée:
en utilisant Eclipse
cheers, Balint
la source
Si vous voulez une solution rapide et sale, vous pouvez faire ce qui suit (bien que je ne le recommande pas pour quoi que ce soit, sauf les projets de test, maven se plaindra longuement que ce n'est pas approprié).
Ajoutez une entrée de dépendance pour chaque fichier jar dont vous avez besoin, de préférence avec un script perl ou quelque chose de similaire et copiez / collez cela dans votre fichier pom.
la source
Une solution batch rapide et sale (basée sur la réponse d'Alex):
libs.bat
Exécuter comme ceci:
libs.bat > libs.txt
. Ensuite, ouvrezlibs.txt
et copiez son contenu en tant que dépendances.Dans mon cas, je n'avais besoin que des bibliothèques pour compiler mon code, et cette solution était la meilleure à cet effet.
la source
Même si cela ne correspond pas exactement à votre problème, je vais le déposer ici. Mes exigences étaient:
Parlons d'abord de (3): Le simple fait d'avoir les pots dans un dossier et de les fusionner dans le pot final ne fonctionnera pas ici, car l'IDE ne comprendra pas cela. Cela signifie que toutes les bibliothèques doivent être installées correctement. Cependant, je ne veux pas que tout le monde l'installe en utilisant "mvn install-file".
Dans mon projet, j'avais besoin de metawidget. Et c'est parti:
Chaque fois que vous avez une nouvelle bibliothèque, ajoutez simplement une nouvelle exécution et dites à tout le monde de reconstruire le projet (vous pouvez améliorer ce processus avec les hiérarchies de projet).
la source
Pour installer le pot tiers qui n'est pas dans le référentiel maven, utilisez maven-install-plugin.
Voici les étapes:
Ci-dessous, par exemple celui que je l'ai utilisé pour simonsite log4j
Dans le pom.xml, incluez la dépendance comme ci-dessous
Exécutez la commande mvn clean install pour créer votre emballage
Ci-dessous le lien de référence:
https://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html
la source
Pour ceux qui n'ont pas trouvé de bonne réponse ici, c'est ce que nous faisons pour obtenir un pot avec toutes les dépendances nécessaires. Cette réponse ( https://stackoverflow.com/a/7623805/1084306 ) mentionne l'utilisation du plugin Maven Assembly mais ne donne pas réellement d'exemple dans la réponse. Et si vous ne lisez pas jusqu'à la fin de la réponse (c'est assez long), vous risquez de le manquer. L'ajout de ce qui suit à votre pom.xml générera
target/${PROJECT_NAME}-${VERSION}-jar-with-dependencies.jar
la source
J'ai fait allusion à du code python dans un commentaire à la réponse de @alex lehmann, alors je le poste ici.
la source
Cela ne répond pas à la façon de les ajouter à votre POM, et peut être une évidence, mais cela ajouterait-il simplement le répertoire lib à votre chemin de classe? Je sais que c'est ce que je fais quand j'ai besoin d'un pot externe que je ne veux pas ajouter à mes dépôts Maven.
J'espère que cela t'aides.
la source
Ce qui fonctionne dans notre projet est ce qu'Archimedes Trajano a écrit, mais nous avions dans notre .m2 / settings.xml quelque chose comme ceci:
et le * devrait être changé en central. Donc, si sa réponse ne fonctionne pas pour vous, vous devriez vérifier vos paramètres.xml
la source
Je voulais juste une solution rapide et sale ... Je ne pouvais pas exécuter le script de Nikita Volkov: erreur de syntaxe + cela nécessite un format strict pour les noms des pots.
J'ai fait ce script Perl qui fonctionne avec n'importe quel format pour les noms de fichiers jar, et il génère les dépendances dans un xml afin qu'il puisse être copié collé directement dans un pom.
Si vous souhaitez l'utiliser, assurez-vous de bien comprendre ce que fait le script, vous devrez peut-être modifier
lib
dossier et la valeur degroupId
ouartifactId
...la source
La solution pour l'approche scope = 'system' en Java:
la source