web-dev-qa-db-fra.com

Liste des fichiers jar de dépendance dans Maven

En utilisant Maven 2, existe-t-il un moyen de répertorier les dépendances du pot en tant que noms de fichiers?

mvn dependency:build-classpath 

peut répertorier les fichiers jar, mais cela inclura le chemin d'accès complet à leur emplacement dans mon référentiel local. Ce dont j'ai besoin est essentiellement juste une liste des noms de fichiers (ou les noms de fichiers que l'objectif de dépendances de copie a copiés).

Donc, la liste dont j'ai besoin serait quelque chose comme

activation-1.1.jar,antlr-2.7.6.jar,aopalliance-1.0.jar etc...

idéalement comme une propriété maven, mais je suppose qu'un fichier tel que build-classpath peut générer fera l'affaire.

Ce que j'essaie de réaliser, c'est d'écrire un Bundle-ClassPath vers un fichier MANIFEST.MF autrement géré manuellement pour un ensemble OSGi. (Vous ne devriez pas avoir besoin de comprendre ce bit pour répondre à la question.)

Pour clarifier: La question est pas sur la façon d'écrire les en-têtes de manifeste dans le fichier MANIFEST.MF dans un bocal (qui est facilement googleble). Je demande comment obtenir les données que je veux écrire, à savoir la liste ci-dessus.

58
Sindri Traustason

Cette commande va générer l'arborescence des dépendances de votre projet maven:

$ mvn dependency:tree

Je suis sûr que le résultat vous plaira :-)

70
Anis

Pour autant que je sache, vous ne pouvez pas obtenir exactement cette sortie, avec les virgules et sans espaces. À la fois via la ligne de commande et via le fichier pom.xml, le plugin maven-dependency ou la CLI flippe si vous spécifiez des espaces ou le '' (chaîne vide) comme substitut avec pathSeparator ou fileSeparator. Ainsi, vous pourriez être forcé de parvenir à un compromis. Vous pouvez

 dépendance mvn: build-classpath -Dmdep.pathSeparator = ":" -Dmdep.prefix = '' -Dmdep.fileSeparator = ":" -Dmdep.outputFile = classpath 

Cependant, cela devrait vous donner une liste complète, séparée par '::' au lieu de simplement ',', mais ça marche. Si vous exécutez:

 dépendance mvn: build-classpath -Dmdep.pathSeparator = "@ REPLACEWITHCOMMA" -Dmdep.prefix = '' -Dmdep.fileSeparator = "@" -Dmdep.outputFile = classpath 

et attachez-le au generate-resources phase et filtrez cette ressource ultérieurement en définissant la propriété correcte dans process-resources phase du cycle de vie, vous devriez pouvoir obtenir juste la virgule.

Vous pouvez voir la liste complète des options sur: http://maven.Apache.org/plugins/maven-dependency-plugin/build-classpath-mojo.html

18
Gabe Mc

Voici la commande que vous demandez

$ mvn dependency:tree

Pour les grands projets, il peut produire beaucoup de texte. Je suppose que vous voulez vérifier que l'arborescence des dépendances contient une certaine dépendance, vous n'avez donc pas besoin d'une liste complète.

Voici comment filtrer la sortie sous Windows:

$ mvn dependency:tree | findstr javax.persistence

Et voici comment vous pouvez le faire sous Linux:

$ mvn dependency:tree | grep javax.persistence

Façon Maven de filtrer l'arborescence des dépendances (fonctionne dans Windows cmd, MacOS et Linux Shell):

$ mvn dependency:tree -Dincludes=javax.persistence:*

Manière Maven (Windows PowerShell):

$ mvn dependency:tree '-Dincludes=javax.persistence:*'
9
naXa

En fait, pour juste la liste finale des pots, utilisez simplement

mvn dependency:list

Ce qui est beaucoup plus simple que la dépendance: arbre qui est une surpuissance pour obtenir simplement la liste finale car il montre un arbre transitif détaillé et une résolution de conflit (avec verbose).

7
kisna

Avez-vous regardé le projet Apache Felix ? Il a tout un tas de plugins, y compris un plugin bundle qui devrait faire ce que vous voulez.

De plus, avez-vous essayé le <addClasspath> tag avec <manifestFile>? Cela devrait avoir l'effet souhaité de fusionner le chemin de classe dans votre manifeste.

<plugin>
  <groupId>org.Apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  ...
  <configuration>
    <archive>
      <addClasspath>true</addClasspath>
      <manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile>
    </archive>
  </configuration>
  ...
</plugin>
5
sblundy

Il me manque peut-être quelque chose ici, mais comme vous avez déjà utilisé des dépendances de copie, cela ressemble à ce que vous recherchez vraiment n'est qu'une liste de fichiers dans un répertoire spécifié.

Ant peut le faire pour vous sans aucun problème, tout comme un script Shell.

3
Kevin Wright

Maven peut créer automatiquement le chemin de classe dans votre manifeste: http://maven.Apache.org/guides/mini/guide-manifest.html

Il s'agit d'une configuration du plugin d'archive Maven.

2
Davide Gualano

Pour ajouter une encoche aux réponses existantes, le plug-in maven-dependency-plugin actuel permet d'enregistrer le chemin de classe dans une propriété avec le paramètre outputProperty .

1
Andrew

Voici un script awk pour diriger mvn dependency:list:

mvn dependency:list | awk -f mvnfmt.awk

Vous pouvez | sort si vous voulez trier par nom, ou | tr '\n' ':' pour le formater en chemin de classe.

mvnfmt.awk est:

BEGIN {
    found = 0
}

/The following files have been resolved/ {
    found = 1
    next
}

/^\[INFO\] \$/ {
    print "Empty " found
    if (found != 0) found = 0
}

{
    if (!found) next
    n = split($0, a, " ")
    if (n != 2) {
        found = 0
        next
    }
    split(a[2], a, ":")
    print a[2] "-" a[4] "." a[3]
}   
0
Matthieu