2010-01-14 14 views
50

J'utilise le plugin maven-assemblage pour créer un pot de ma demande, y compris ses dépendances comme suit:assemblage Maven 2 avec dépendances: pot sous la portée « système » non inclus

<assembly> 
    <id>macosx</id> 
    <formats> 
     <format>tar.gz</format> 
     <format>dir</format> 
    </formats> 
    <dependencySets> 
     <dependencySet> 
      <includes> 
       <include>*:jar</include> 
      </includes> 
      <outputDirectory>lib</outputDirectory> 
     </dependencySet> 
    </dependencySets> 
</assembly> 

(j'omis une autre ce qui n'est pas lié à la question)

Jusqu'à présent, cela a fonctionné correctement car il crée un répertoire lib avec toutes les dépendances. Cependant, j'ai récemment ajouté une nouvelle dépendance dont la portée est system, et elle ne le copie pas dans le répertoire de sortie lib. Je dois manquer quelque chose de fondamental ici, alors je demande de l'aide.

La dépendance que je viens d'ajouter est la suivante:

<dependency> 
    <groupId>sourceforge.jchart2d</groupId> 
    <artifactId>jchart2d</artifactId> 
    <version>3.1.0</version> 
    <scope>system</scope> 
    <systemPath>${project.basedir}/external/jchart2d-3.1.0.jar</systemPath> 
</dependency> 

La seule façon que j'ai pu inclure cette dépendance était en ajoutant ce qui suit à l'élément d'assemblage:

<files> 
    <file> 
     <source>external/jchart2d-3.1.0.jar</source> 
     <outputDirectory>lib</outputDirectory> 
    </file> 
</files> 

Cependant, ces forces moi de changer le pom et le fichier d'assemblage chaque fois que ce pot est renommé, si jamais. En outre, il semble juste faux. J'ai essayé avec <scope>runtime</scope> dans le dependencySets et <include>sourceforge.jchart2d:jchart2d</include> sans chance.

Alors comment inclure un fichier system dans votre fichier d'assemblage dans maven 2?

Merci beaucoup

+0

La portée "runtime" ne changera pas le résultat, car c'est la valeur par défaut. – khmarbaise

+0

Je viens de pousser jchart2d à Maven Central! http://sourceforge.net/news/?group_id=50440 - profitez-en! – halfdan

Répondre

68

Je ne suis pas surpris que les dépendances de la portée du système ne sont pas ajoutés (après tout, les dépendances avec un champ d'application du système doivent être fournies explicitement par définition). En fait, si vous ne voulez vraiment pas mettre cette dépendance dans votre dépôt local (par exemple parce que vous voulez le distribuer dans le cadre de votre projet), voici ce que je ferais:

  • je mettrais la dépendance dans un "référentiel de système de fichiers" local au projet.
  • Je déclare que dépôt dans mon pom.xml comme ceci:

    <repositories> 
        <repository> 
        <id>my</id> 
        <url>file://${basedir}/my-repo</url> 
        </repository> 
    </repositories> 
    
  • Je voudrais simplement déclarer l'artefact sans la portée system, ceci est juste une source de problèmes:

    <dependency> 
        <groupId>sourceforge.jchart2d</groupId> 
        <artifactId>jchart2d</artifactId> 
        <version>3.1.0</version> 
    </dependency> 
    

Je ne suis pas sûr à 100% que cela conviendra à vos besoins, mais je pense que c'est une meilleure solution que d'utiliser la portée du système.

Mise à jour: J'aurais dû le mentionner dans ma réponse originale et je le corrige maintenant. Pour installer une bibliothèque tierce partie dans le référentiel de fichiers, utilisez install:install-file avec le paramètre localRepositoryPath:

mvn install:install-file -Dfile=<path-to-file> \ 
         -DgroupId=<myGroup> \ 
         -DartifactId=<myArtifactId> \ 
         -Dversion=<myVersion> \ 
         -Dpackaging=<myPackaging> \ 
         -DlocalRepositoryPath=<path-to-my-repo> 

Vous pouvez coller cela comme est dans une coquille * nix. Sur Windows, supprimez le "\" et mettez tout sur une seule ligne.

+0

Excellente idée, je vais l'essayer. – YuppieNetworking

+1

Cela a fonctionné, mais ce n'était pas une tâche triviale d'installer le fichier dans un dépôt local différent de $ HOME/.m2/repository. Je devais faire une installation de mvn: install-file [... options de fichier d'installation ...] -Dmaven.repo.local = path_to_my_local_repo qui a forcé maven à télécharger ses plugins les plus basiques. Pourriez-vous suggérer comment installer des fichiers dans ce repo local? – YuppieNetworking

+0

J'aurais dû le mentionner :) J'aurais installé l'artefact dans le repo local ('~ /.m2/repository') avec 'install: install-file', puis déplacé l'arborescence de répertoires vers' $ {basedir}/my-repo'. Je supprimerais simplement les éléments non désirés de '$ {basedir}/my-repo' dans votre cas. –

19

Btw vous pouvez l'automatiser et en faire une partie de votre build maven. Ce qui suit installera votre pot dans votre dépôt local avant la compilation:

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-install-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>hack-binary</id> 
        <phase>validate</phase> 
        <configuration> 
         <file>${basedir}/lib/your-lib.jar</file> 
         <repositoryLayout>default</repositoryLayout> 
         <groupId>your-group</groupId> 
         <artifactId>your-artifact</artifactId> 
         <version>0.1</version> 
         <packaging>jar</packaging> 
         <generatePom>true</generatePom> 
        </configuration> 
        <goals> 
         <goal>install-file</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
+0

Ne prend-il pas en charge l'installation de plusieurs fichiers à la fois? –

+0

Wow, c'est très bien! Merci beaucoup! @Tuukka Mustonen vous devez copier le ... partie pour chaque fichier – timaschew

+5

Malheureusement, cela ne fonctionne pas. Je suis également arrivé à cette solution, pensant que cela semblait la plus simple, mais Maven exige que toutes les dépendances soient résolues _before_ en exécutant des plugins liés à la phase 'validate' (qui précède' compile', etc ...). Ainsi, une fois l'artefact installé, il sera réinstallé, mais il ne fera pas l'installation initiale - c'est un problème de poule/oeuf. Un _peut_ lier ceci à la phase 'clean' (car cela ne nécessite pas d'abord une résolution de dépendance) et dire aux développeurs de lancer d'abord' mvn clean', mais ensuite il ne fonctionne plus en utilisant des "procédures standards". – Chadwick

14

Je trouve une solution facile au cas où vous créer pot

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-war-plugin</artifactId> 
    <version>2.1.1</version> 
    <configuration> 
    <webResources> 
    <resource> 
     <directory>dependencies/mydep</directory> 
     <targetPath>WEB-INF/lib</targetPath> 
     <filtering>true</filtering> 
     <includes> 
      <include>**/*.jar</include> 
     </includes> 
    </resource> 
    </webResources> 
</configuration> 
</plugin> 
+3

Ceci est beaucoup plus simple ... Pourquoi ajouter au dépôt local etc? –

+0

C'est une façon rapide et sale de faire les choses. Merci. Un jour, le monde sera tout maven, mais jusque-là, cela sauve notre vie. – Jacob

+0

À mon humble avis, il serait plus sûr avec le filtrage: faux – ATorras

4

Vous pouvez également gérer cela par l'ajout d'un dependencySet supplémentaire dans votre dependencySets.

<dependencySet> 
    <scope>system</scope> 
    <includes> 
    <include>*:jar</include> 
    </includes> 
    <outputDirectory>lib</outputDirectory> 
</dependencySet> 

La meilleure chose serait d'utiliser un gestionnaire de référentiel (comme Nexus, Artifactory, Archiva) et installer ce genre de dépendance dans un référentiel particulier. Après cela, vous pouvez utiliser de telles choses comme une simple dépendance. Cela va vous simplifier la vie.

Docs: https://maven.apache.org/plugins/maven-assembly-plugin/assembly.html

1

Modifié: Désolé que je ne savais pas ALX également mentionné au sujet de la solution de contournement du cycle de vie propre. Sur base de la solution fournie par alx, vous pouvez exécuter l'étape d'installation du fichier lors de la phase de nettoyage. mais puisque la phase de nettoyage n'est pas dans le cycle de vie par défaut, vous devez exécuter mvn clean à la première fois pour vous assurer que le pot est prêt dans le repo local.

ex: mvn clean; mvn package

2

Une solution simple pour cela est d'ajouter dans repository locaux

Une façon de faire est via mvn installer des commandes comme suggéré dans post précédent.

Un autre moyen facile est, 1) Dans votre Eclipse Eclipse cliquez droit sur le projet sélectionnez l'option Maven. 2) Sélectionnez Installer ou déployer un artefact dans une option de référentiel maven et cliquez sur suivant. 3) Cliquez sur Parcourir à côté de la case à cocher fichier artefact & sélectionner votre fichier jar 4) Entrez le GroupId et ArtifactId et la version assurer générer pom & créer la somme de contrôle sont vérifiés & l'emballage est pot

Cliquez sur la finition, Wallah !! ! votre travail est terminé le jar est ajouté dans votre dépôt local que vous pouvez définir dans le répertoire setting.xml ou m2

Maintenant, ajoutez simplement la dépendance maven simple selon le GroupId, ArtifactId & version jar que vous avez entré selon le importer et c'est votre pot externe sera emballé par maven.

+0

Merci pour l'aide. Cela a fonctionné très bien pour moi et c'est certainement plus facile que les autres moyens donnés ici. À votre santé :) –