Maven: Comment inclure des jars, qui ne sont pas disponibles dans les représentants dans un projet J2EE?

100

dans mon projet J2EE, j'ai quelques dépendances, qui ne sont disponibles dans aucun référentiel Maven, car ce sont des bibliothèques propriétaires. Ces bibliothèques doivent être disponibles au moment de l'exécution, de sorte qu'elles doivent être copiées dans la cible /.../ WEB-INF / lib ...

Pour le moment, je les énumère en tant que dépendance système dans mon POM, mais avec cette méthode, le problème est qu'ils ne sont pas copiés dans la version cible lors de la compilation. Cette méthode n'est pas non plus très élégante.

Alors, quelle est la meilleure façon de les intégrer dans Maven?

Remarque: je ne souhaite pas créer mon propre référentiel Maven.

Samson
la source
7
Je pense vraiment que vous devriez revoir votre décision de créer un référentiel Maven. Ce n'est pas du tout difficile et ça vaut le coup à 100%.
Robert Munteanu
7
La valeur de la création d'un référentiel Maven dépend des circonstances.
yincrash

Réponses:

54

Comme vous l'avez dit, vous ne voulez pas créer votre propre référentiel, cela vous aidera peut-être.

Vous pouvez utiliser l' objectif de fichier d'installation de maven-install-plugin pour installer un fichier dans le référentiel local. Si vous créez un script avec une invocation Maven pour chaque fichier et que vous le conservez à côté des fichiers JAR, vous (et toute autre personne ayant accès) pouvez facilement installer les fichiers JAR (et les fichiers pom associés) dans leur référentiel local.

Par exemple:

mvn install:install-file -Dfile=/usr/jars/foo.jar -DpomFile=/usr/jars/foo.pom
mvn install:install-file -Dfile=/usr/jars/bar.jar -DpomFile=/usr/jars/bar.pom

ou juste

mvn install:install-file -Dfile=ojdbc14.jar -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.2.0 -Dpackaging=jar

Vous pouvez ensuite référencer les dépendances comme d'habitude dans votre projet.

Cependant, votre meilleur pari est toujours de configurer un référentiel distant interne et je recommanderais d'utiliser Nexus moi-même. Il peut fonctionner sur votre boîte de développement si nécessaire, et la surcharge est minime.

Vendeur riche
la source
1
Merci cette méthode fonctionne bien pour moi maintenant. J'ai étendu le POM pour que les fichiers soient automatiquement installés sur le représentant local: pastebin.ca/1504318
samson
Heureux d'aider, mais comme d'autres l'ont dit, la meilleure approche serait d'utiliser un gestionnaire de référentiel Maven. Cette approche ne s'adapte pas bien.
Rich Seller
4
La commande qui a fonctionné pour moi: "mvn install: install-file -Dfile = cassandra-jdbc-1.1.1.jar -DgroupId = org.apache-extras.cassandra-jdbc -DartifactId = cassandra-jdbc -Dversion = 1.1.1 -Dpackaging = jar "
Mazrick
193

Pour les personnes souhaitant une solution rapide à ce problème:

<dependency>
  <groupId>LIB_NAME</groupId>
  <artifactId>LIB_NAME</artifactId>
  <version>1.0.0</version>
  <scope>system</scope>
  <systemPath>${basedir}/WebContent/WEB-INF/lib/YOUR_LIB.jar</systemPath>
</dependency>

donnez simplement à votre bibliothèque un identifiant de groupe et un nom d'artefact uniques et pointez vers son emplacement dans le système de fichiers. Tu es prêt.

Bien sûr, il s'agit d'une solution rapide et sale qui fonctionnera UNIQUEMENT sur votre machine et si vous ne modifiez pas le chemin d'accès aux bibliothèques. Mais parfois, c'est tout ce que vous voulez, exécuter et faire quelques tests.

EDIT: il suffit de redéfinir la question et de réaliser que l'utilisateur utilisait déjà ma solution comme solution temporaire. Je laisserai ma réponse comme une aide rapide pour les autres qui viennent à cette question. Si quelqu'un n'est pas d'accord avec cela, laissez-moi un commentaire. :)

Ric Jafe
la source
4
Cool. Existe-t-il un moyen de spécifier une URL au lieu d'un chemin d'accès à la machine locale?
phreakhead
3
Merci pour un exemple complet et fonctionnel !!! J'espère que vous attrapez un poisson d'or et qu'il vous exauce trois vœux. :)
johndodo
14
Cela devrait être la réponse acceptée car elle est autonome (dans pom.xml)
Vikram
2
Salut Rajarshee, les identifiants de groupe et d'artefact sont complètement arbitraires. Le chemin d'accès à votre fichier jar dans le système de fichiers est tout ce qui compte pour que cela fonctionne. Parce qu'en réalité le pot n'est pas une dépendance maven, vous dites seulement à Maven de le traiter comme tel.
Ric Jafe
1
À partir de 2016, cela ne semble pas fonctionner. La version reconnaît le chemin mais n'inclut pas le code dans le fichier jar ombré. Rats ...
markthegrea
24

Créez un dossier de référentiel sous votre projet. Prenons

${project.basedir}/src/main/resources/repo

Ensuite, installez votre fichier jar personnalisé dans ce dépôt:

mvn install:install-file -Dfile=[FILE_PATH] \
-DgroupId=[GROUP] -DartifactId=[ARTIFACT] -Dversion=[VERS] \ 
-Dpackaging=jar -DlocalRepositoryPath=[REPO_DIR]

Enfin, ajoutez les définitions de dépôt et de dépendance suivantes aux projets pom.xml:

<repositories>
    <repository>
        <id>project-repo</id>
        <url>file://${project.basedir}/src/main/resources/repo</url>
    </repository>
</repositories>

<dependencies>    
    <dependency>
        <groupId>[GROUP]</groupId>
        <artifactId>[ARTIFACT]</artifactId>
        <version>[VERS]</version>
    </dependency>
</dependencies>
Mostar
la source
1
Cela a très bien fonctionné pour moi. PS Je recommanderais un répertoire différent pour le dépôt local car le mettre dans "src" ne semblait pas correct (ce n'est pas la source!)
davidfrancis
1
Ça a marché comme sur des roulettes. Je migre un ancien projet d'Ant vers Maven et il y a quelques bibliothèques que je ne trouve pas dans les dépôts Web.
Paulo Pedroso
Attention: lorsque la valeur de -DlocalRepositoryPath ne se termine pas par /(c'est- à -dire, indiquant un dossier), alors le dépôt est créé avec groupId. Ex: si l'ID de groupe est foo.comet localRepositoryPath est repo, le dossier du référentiel devient repo.foo.com.
Sheshadri Mantha
Cette procédure est un projet de gestion du référentiel système local à l'aide de l'outil d'automatisation de construction maven utilisé principalement pour les projets Java et le système de fichiers.
Oleksii Kyslytsyn le
8

Vous devez configurer un référentiel local qui hébergera ces bibliothèques. Il existe un certain nombre de projets qui font exactement cela. Par exemple Artifactory .

Grégory Mostizky
la source
4
Un point sur la terminologie, ce sont des référentiels internes distants, pas des référentiels locaux. Le référentiel local est celui sur lequel les dépendances du système de fichiers local sont téléchargées.
Rich Seller
3

Aucune des solutions ne fonctionne si vous utilisez la version Jenkins !! Lorsque pom est exécuté à l'intérieur du serveur de construction Jenkins ... ces solutions échoueront, car Jenkins exécutera pom tentera de télécharger ces fichiers à partir du référentiel d'entreprise.

Copiez les fichiers jars sous src / main / resources / lib (créez le dossier lib). Ceux-ci feront partie de votre projet et iront jusqu'au serveur de déploiement. Dans le serveur de déploiement, assurez-vous que vos scripts de démarrage contiennent src / main / resources / lib / * dans le chemin de classe. Alto.

Apurva Singh
la source
2

vous pouvez les installer dans un référentiel local privé (par exemple .m2 / référentiel sous votre répertoire personnel): plus de détails ici

dfa
la source
7
Oui, je pourrais le faire, mais ensuite je devrais dire à tous ceux qui veulent construire le projet qu'il doit mettre les fichiers X, Y dans le répertoire Z et cela complique vraiment les choses. Après tout, je veux utiliser Maven pour simplifier le processus de construction.
samson
2

Si je comprends bien, si ce que vous voulez faire est d'exporter les dépendances pendant la phase de compilation afin qu'il n'y ait pas besoin de récupérer manuellement chacune des bibliothèques nécessaires, vous pouvez utiliser les dépendances de copie mojo .

J'espère que cela peut être utile dans votre cas ( exemples )

Erik Clairiot
la source
2

La solution de @Ric Jafe est ce qui a fonctionné pour moi.

Ceci est exactement ce que je cherchais. Un moyen de le faire passer pour le code de test de recherche. Rien d'extraordinaire. Ouais, je sais que c'est ce qu'ils disent tous :) Les différentes solutions de plugins maven semblent exagérées pour mes besoins. J'ai des fichiers JAR qui m'ont été donnés en tant que bibliothèques tierces avec un fichier pom. Je veux qu'il compile / s'exécute rapidement. Cette solution que j'ai banalement adaptée à python a fait des merveilles pour moi. Coupé et collé dans mon pom. Le code Python / Perl pour cette tâche se trouve dans cette Q&R: Puis-je ajouter des fichiers JAR à maven 2 build classpath sans les installer?

def AddJars(jarList):
  s1 = ''
  for elem in jarList:
   s1+= """
     <dependency>
        <groupId>local.dummy</groupId>
        <artifactId>%s</artifactId>
        <version>0.0.1</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/manual_jars/%s</systemPath>
     </dependency>\n"""%(elem, elem)
  return s1
Paul
la source
La solution ci-dessus renvoie «dependencies.dependency.systemPath» pour xx.jar ne doit pas pointer vers les fichiers dans le répertoire du projet. Voir stackoverflow.com/questions/10935135/…
sarah.ferguson
1

L'installation seule n'a pas fonctionné pour moi.

mvn deploy:deploy-file -Durl=file:///home/me/project/lib/ \
  -Dfile=target/jzmq-2.1.3-SNAPSHOT.jar -DgroupId=org.zeromq \  
  -DartifactId=zeromq -Dpackaging=jar -Dversion=2.1.3
Jonathan Hendler
la source