2017-06-05 3 views
1

Nous avons un projet git qui a des jars tiers qui ne sont pas disponibles dans les repo Maven et sont dans un dossier "lib" dans le projet. Je dois les inclure pour compiler, construire et ensuite les empaqueter dans le WAR au WEB-INF/lib.Comment inclure des jars tiers dans le projet maven (compile, build, package) où l'ajout de repo maven local n'est pas une option?

Je ne peux pas les ajouter en tant que repo maven local à partir de la ligne de commande, car ces projets doivent être compilables pour tous ceux qui clonent le repo sans avoir besoin d'exécuter des commandes supplémentaires.

J'ai vu certaines personnes, mais indique qu'il est possible que système alors Maven ne les emballer dans votre WAR:

<dependency> 
    <groupId>com.roufid.tutorials</groupId> 
    <artifactId>example-app</artifactId> 
    <version>1.0</version> 
    <scope>system</scope> 
    <systemPath>${basedir}/lib/yourJar.jar</systemPath> 
</dependency> 

Comment puis-je obtenir ces pots à utiliser pour la compilation/inspection, bâtiment, puis emballés dans la guerre?

Répondre

1

Vous pouvez utiliser:

  • portée du système, mais que l'emballage vous-même via assembly plug-in
  • Un repo Maven ainsi que votre projet (repo-à-dire Maven à la volée , fondamentalement même que le repo local mais sans avoir une partie mobile supplémentaire à s'inquiéter parce que ce repo suit votre projet).

Pour repo Maven sur la volée option, vous pouvez le faire comme décrit here (ce qui est, prendre une pension de Maven déjà existant qui contient déjà vos pots nécessaires, comme votre un local, le mettre dans votre projet, puis faites référence à ce rapport auprès de votre projet en utilisant des chemins relatifs).

+0

Pouvez-vous s'il vous plaît fournir quelques étapes et exemples pour faire le "repo à la volée"? –

+0

Un repo Maven, à la base est juste une structure de répertoires et de certains fichiers. Ce que j'ai fait était de placer mes artefacts dans mon repo local, via 'mvn install', puis de copier les dossiers de mon repo local, dans un dossier de mon projet, en veillant à maintenir la structure du repo. Ensuite, vous vous référez à votre repo via la section 'repositories' tout comme n'importe quel autre repo, mais en vous assurant d'utiliser le chemin relatif. – Andrei

+1

... Donc, fondamentalement, comme ceci: https://stackoverflow.com/a/28762617/895067 – Andrei

-1

Utilisez la barre oblique (/) pour barre oblique inversée() dans le chemin système.

<dependency> 
<groupId>com.roufid.tutorials</groupId>`enter code here` 
<artifactId>example-app</artifactId> 
<version>1.0</version> 
<scope>system</scope> 
<systemPath>${basedir}\lib\yourJar.jar</systemPath> 

0

Je suppose que vous avez vérifié que tout mécanisme que vous pourriez utiliser pour distribuer ces bocaux serait conforme aux licences pertinentes. Si tel était le cas, il semblerait que les créateurs des pots ne seraient pas en mesure de fournir une distribution officielle de Maven, donc votre meilleure option serait de faire pression pour qu'ils le fassent. Mais sinon, et pourtant pour une raison quelconque, ils vous permettront de distribuer le pot (soit par le clonage de votre repo, ou via un rapport Maven séparé que vous maintenez):

Il existe plusieurs façons. Je donne la préférence aux approches qui ne pas mettre les pots dans le repo git.

publier un Maven repo

Il est donc possible d'accueillir une prise en pension destiné au public et servir les objets de cette façon. Le pom peut ajouter votre repo orienté public à la construction, de sorte que ceux qui clonent peuvent construire sans avoir à exécuter de commandes spéciales.

L'exécution de votre propre dépôt n'est pas très difficile. Les versions OSS de Nexus ou Artifactory jFrog seraient probablement parfaitement capables. Mais, si nous supposons que les auteurs refusent de publier leurs propres fichiers via Maven, ils ne veulent pas les distribuer de cette façon, alors il n'y a aucune raison de passer beaucoup de temps sur les détails de cette option. Alors en route ...

distribution dans la distribution Git repo

Je suppose que cela est ce que vous faites, mais encore une fois si Maven viole la licence que je ferais que vous partagez les cheveux de la bonne façon de penser que cette ne le fait pas. Donc, la question serait de savoir comment amener Maven à traiter les artefacts distribués de cette manière, et encore une fois, il y a quelques options. Votre objection à mettre les pots dans le dépôt local est que cela nécessiterait des commandes supplémentaires de l'utilisateur; mais en fait cela pourrait être automatisé dans la phase de "validation" de la construction. La liaison install:install-file à la phase de validation devrait fonctionner.

Alternativement, votre objection à l'utilisation de la portée system est que le fichier n'est pas copié dans la guerre finale. Vous pourriez être en mesure d'utiliser le plugin de dépendance pour forcer le problème, mais je ne suis pas sûr de cela. Ce dont je suis sûr, c'est que vous pouvez traiter le répertoire contenant les fichiers jar comme une ressource web avec une configuration appropriée dans le plugin war. (Vous voudriez qu'il soit traité comme non filtrée et à la carte dans le dossier WEB-INF/lib.)

Dans tous les cas, si vous distribuez des pots (ou d'autres grands binaires) dans le git, je vous recommande fortement regardez git lfs . Cela nécessitera une configuration unique par chacun de vos utilisateurs, mais cela empêchera votre dépôt de devenir graduellement gonflé et inutilisable.

+0

Ce sont des bocaux privés pour la société qui n'a aucun intérêt à publier dans un repo Maven (privé ou public). Je n'ai aucun contrôle sur cela et votre réponse ne répond pas à la question, mais plutôt un commentaire «Je n'aime pas vos exigences». –

+0

Désolé de vous entendre, vous ne pouvez pas utiliser la première des nombreuses options que j'ai fournies. Votre évaluation selon laquelle je n'ai pas répondu à la question est clairement basée sur le fait que vous n'avez pas lu toute la réponse, alors vous êtes seul. –