Télécharger toutes les dépendances maven dans un répertoire PAS dans le référentiel?

127

J'ai commencé à convertir mon projet en maven parce que je devais utiliser une bibliothèque qui était distribuée sous forme binaire sur maven uniquement, mais après m'être cogné la tête contre le mur pendant trop longtemps, j'ai décidé d'arrêter de me blesser et d'utiliser simplement Fourmi. J'aimerais simplement que maven télécharge le fichier jar et toutes ses dépendances transitives dans un répertoire de mon choix afin que je puisse simplement les archiver dans mon SCM comme j'aime normalement et être à nouveau un développeur heureux.
Des idées comment faire cela facilement?

chubbsondubs
la source
2
Envisagez d'utiliser Ivy et obtenez la gestion des dépendances transitive dont vous avez besoin, avec la fourmi en laquelle vous avez confiance. Ou mordez la balle et utilisez la structure de répertoires Maven.
Dave Newton
Avez-vous essayé Ivy ?
Tomasz Nurkiewicz
5
Non, mais j'ai passé toute ma patience à changer à ce stade. Peut-être la prochaine fois. Je veux revenir au codage. Cela peut-il être fait avec maven?
chubbsondubs

Réponses:

260

Le plugin de dépendance maven peut potentiellement résoudre votre problème.

Si vous avez pomspécifié toutes les dépendances de votre projet, il vous suffit d'exécuter

mvn dependency:copy-dependencies

et vous trouverez le target/dependenciesdossier rempli de toutes les dépendances, y compris transitive.

Ajout de la réponse de Gustavo ci - dessous : Pour télécharger les sources de dépendance , vous pouvez utiliser

mvn dependency:copy-dependencies -Dclassifier=sources

(via Apache Maven Dependency Plugin doc ).

Raghuram
la source
1
Thx @Raghuram, je cherche ça depuis des lustres.
eskalera
mais que faire si je souhaite copier toutes les dépendances dans mon dépôt local? Est-il censé être utilisé? Pourquoi copier s'il est peut-être déjà dans le dépôt local. C'est de toute façon local.
ses
1
@ses Une compilation standard de maven (par exemple, compiler, tester, empaqueter, installer, etc.; pas sûr de valider) copie déjà toutes les dépendances dans votre dépôt local par défaut. Ce n'est pas pour ça. Au lieu de cela, c'est pour les situations où vous avez besoin des dépendances de votre application pour une raison quelconque. Je l'utilise en ce moment pour inspecter les bibliothèques dépendantes pour les définitions d'API redondantes (par exemple, certaines bibliothèques comprendront des API Javax, qui peuvent entrer en conflit avec d'autres versions de la même API), mais c'est également bon si votre application a besoin de ses dépendances emballées avec elle pour la distribution, ou n'importe quoi.
Spanky Quigman
1
+1 pour une réponse claire, concise et utile. Je viens de passer par la même danse Maven que l'OP et je voulais juste récupérer les dépendances du fichier JAR. Merci! J'aimerais pouvoir +10
Brandon
@Raghuram Techniquement, vous vous retrouvez avec tous les artefacts (résolus) dans "cible / dépendances". En outre, il y a le problème potentiel des collisions de noms car la coordonnée "groupId" d'une dépendance est ignorée. En d'autres termes, "dependency: copy-dependencies" ne préserve pas la structure de mise en page.
whaefelinger
8

Sur la base de la réponse @Raghuram , je trouve un tutoriel sur la copie des dépendances de projet , juste:

  1. Ouvrez votre pom.xmlfichier de projet et recherchez ceci:

    <project>
      [...]
      <build>
        <plugins>
          ...
        </plugins>
      </build>
      [...]
    </project>
  2. Remplacez le <plugins> ... </plugins>par:

    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>3.0.0</version>
        <executions>
          <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
              <goal>copy-dependencies</goal>
            </goals>
            <configuration>
              <outputDirectory>${project.build.directory}/alternateLocation</outputDirectory>
              <overWriteReleases>false</overWriteReleases>
              <overWriteSnapshots>false</overWriteSnapshots>
              <overWriteIfNewer>true</overWriteIfNewer>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  3. Et appelez maven dans la ligne de commande mvn dependency:copy-dependencies

Une fois terminé, il créera le dossier target/dependencydans toutes les jardépendances du répertoire actuel où se trouve le pom.xmlfichier.

utilisateur
la source
Où dois-je taper la commande "mvn"? Faites un clic droit sur maven-project-> Maven -> .. ??
Cuit au four le
Dans une ligne de commande de terminal sur le dossier où se trouve le pom.xmlfichier.
utilisateur
1
Ça n'a pas marché. Je pense que Maven est installé en tant que plugin uniquement. J'ai également dû télécharger manuellement Maven. Puis mvn dependency:copy-dependenciestravaillé!
Cuit au four le
8

J'ai finalement compris comment utiliser Maven. Depuis Eclipse, créez un nouveau projet Maven.

Téléchargez Maven, extrayez l'archive, ajoutez le /bindossier au chemin.

Validez l'installation à partir de la ligne de commande en exécutant mvn -v(affichera la version et le chemin d'installation Java)

Accédez au dossier racine du projet (où pom.xmlse trouve) et exécutez:

mvn dependency:copy-dependencies

Tous les fichiers jar sont téléchargés vers /target/dependency.

Pour définir un autre répertoire de sortie:

mvn dependency:copy-dependencies -DoutputDirectory="c:\temp"

Il est maintenant possible de réutiliser ce projet Maven pour tous les téléchargements de dépendances en modifiant le pom.xml

Ajoutez des fichiers jars au projet java par chemin de construction -> configurez le chemin de construction -> bibliothèques -> ajoutez des fichiers JAR.

Demi cuit au four
la source
1
Ne doit pas nécessairement être un projet d'éclipse. J'ai ouvert un fichier jar dans Java Decompiler et copié le pom.xml dans un dossier vide. J'ai appelé mvn dependency:copy-dependenciescomme vous l'avez décrit à partir de ce dossier et j'ai copié tous les fichiers jar dépendants dans un seul dossier.
Bernhard Döbler
4

J'ai trouvé la commande suivante

mvn dependency:copy-dependencies -Dclassifier=sources

ici maven.apache.org

Gustavo
la source
2

Veuillez vérifier si vous avez des fichiers de configuration dans un ${MAVEN_HOME}/confrépertoire comme settings.xml. Ces fichiers remplacent les paramètres du .m2dossier et à cause de cela, le dossier du référentiel de .m2peut ne pas être visible ou ignoré.

MagGGG
la source