Liste der Abhängigkeits-JAR-Dateien in Maven

77

Gibt es eine Möglichkeit, mit Maven 2 die JAR-Abhängigkeiten nur als Dateinamen aufzulisten?

mvn dependency:build-classpath 

kann die JAR-Dateien auflisten, aber das schließt den vollständigen Pfad zu ihrem Speicherort in meinem lokalen Repository ein. Was ich brauche, ist im Wesentlichen nur eine Liste der Dateinamen (oder der Dateinamen, die das Ziel der Kopierabhängigkeiten kopiert hat).

Die Liste, die ich brauche, wäre also so etwas wie

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

Idealerweise als Maven-Eigenschaft, aber ich denke, eine Datei wie Build-Classpath kann ausreichen.

Was ich erreichen Bundle-ClassPathmöchte , ist das Schreiben einer Datei in eine ansonsten manuell verwaltete MANIFEST.MF-Datei für ein OSGi-Bundle. (Sie sollten dieses Bit nicht verstehen müssen, um die Frage zu beantworten.)

Zur Verdeutlichung: Bei der Frage geht es nicht darum, wie Manifest-Header in die MANIFEST.MF-Datei in einem JAR geschrieben werden (das ist leicht googleble). Ich frage, wie ich die Daten bekomme, die ich schreiben möchte, nämlich die oben gezeigte Liste.

Sindri Traustason
quelle
Reichen Sie einfach einen Patch für das Abhängigkeits-Plugin ein und ich werde ihn auf die nächste Version anwenden. Der Build-Klassenpfad kommt dem, was Sie wollen, am nächsten. Wir müssen nur die Optionen anpassen, um die gewünschte Ausgabe zu erhalten.
Brian Fox

Antworten:

94

Dieser Befehl generiert den Abhängigkeitsbaum Ihres Maven-Projekts:

$ mvn dependency:tree

Ich bin sicher, dass Ihnen das Ergebnis gefallen wird :-)

Anis
quelle
20

Soweit ich das beurteilen kann, kann man mit Kommas und Leerzeichen nicht genau diese Ausgabe erhalten. Sowohl über die Befehlszeile als auch über die Datei pom.xml flippt das Maven-Dependency-Plugin oder die CLI aus, wenn Sie Leerzeichen oder das '' (leere Zeichenfolge) als Ersatz für entweder pathSeparatoroder angeben fileSeparator. Sie könnten also gezwungen sein, einen Kompromiss zu erzielen. Sie können

    mvn-Abhängigkeit: build-classpath -Dmdep.pathSeparator = ":" -Dmdep.prefix = '' -Dmdep.fileSeparator = ":" -Dmdep.outputFile = classpath

Damit sollten Sie jedoch eine vollständige Liste erhalten, die durch '::'statt nur getrennt ist ',', aber es funktioniert. Wenn du läufst:

    mvn-Abhängigkeit: build-classpath -Dmdep.pathSeparator = "@ REPLACEWITHCOMMA" -Dmdep.prefix = '' -Dmdep.fileSeparator = "@" -Dmdep.outputFile = classpath

und hängen Sie dies an die generate-resourcesPhase an und filtern Sie diese Ressource später, indem Sie die richtige Eigenschaft in der process-resourcesPhase des Lebenszyklus festlegen. Sie sollten nur das Komma erhalten können.

Die vollständige Liste der Optionen finden Sie unter: http://maven.apache.org/plugins/maven-dependency-plugin/build-classpath-mojo.html

Gabe Mc
quelle
2
Gute Antwort! Wenn Sie -Dmdep.pathSeparator = 'verwenden,' -Dmdep.prefix = '.' -Dmdep.fileSeparator = '/' Sie erhalten eine durch Kommas getrennte Liste der relativen Dateinamen a la ./file1.jar,./file2.jar, wodurch die Notwendigkeit einer Filterung vermieden wird.
Eero
17

Hier ist der Befehl, nach dem Sie fragen

$ mvn dependency:tree

Bei großen Projekten kann viel Text ausgegeben werden. Ich gehe davon aus, dass Sie überprüfen möchten, ob der Abhängigkeitsbaum eine bestimmte Abhängigkeit enthält, sodass Sie keine vollständige Liste benötigen.

So können Sie die Ausgabe unter Windows filtern:

$ mvn dependency:tree | findstr javax.persistence

Und so geht's unter Linux:

$ mvn dependency:tree | grep javax.persistence

Maven-Methode zum Filtern des Abhängigkeitsbaums (funktioniert in Windows-Cmd-, MacOS- und Linux-Shell):

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

Maven Weg (Windows PowerShell):

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

Verwenden Sie für die endgültige Liste der Gläser einfach

mvn dependency:list

Was viel einfacher ist als die Abhängigkeit: Baum, der ein Overkill ist, um einfach die endgültige Liste zu erhalten, da er einen detaillierten transitiven Baum und eine Konfliktlösung (mit ausführlicher Beschreibung) zeigt.

kisna
quelle
2
Und wenn Sie wollen, dass sie sortiert werden:mvn dependency:list -Dsort=true
mgarde
5

Haben Sie sich das Apache Felix- Projekt angesehen? Es hat eine ganze Reihe von Plugins, einschließlich eines Bundle-Plugins , das tun sollte, was Sie wollen.

Haben Sie auch versucht, das <addClasspath>Tag mit <manifestFile>? Dies sollte den gewünschten Effekt haben, den Klassenpfad in Ihrem Manifest zusammenzuführen.

<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>
sblundy
quelle
Ich kenne Apache Felix, aber das macht nicht das, was ich brauche. Deshalb mache ich das manuell.
Sindri Traustason
addClasspath fügt dem Class-Path-Manifest-Header eine Liste von JARs hinzu. In den Maven-JAR-Plugin-Dokumenten wird nicht erwähnt, dass der Klassenpfad in andere Header eingefügt werden kann. Auch der Bundle-Klassenpfad benötigt mehr als nur eine Liste von Gläsern.
Sindri Traustason
3

Ich vermisse hier vielleicht etwas, aber da Sie bereits Kopierabhängigkeiten verwendet haben, klingt es so, als ob Sie wirklich nur eine Liste von Dateien in einem bestimmten Verzeichnis suchen.

Ant kann dies problemlos für Sie tun, ebenso wie ein Shell-Skript.

Kevin Wright
quelle
Ich stimme zu, ich habe es einfach getan .
Matthieu
1

Um den vorhandenen Antworten eine Kerbe hinzuzufügen, können Sie mit dem aktuellen Maven-Dependency-Plugin den Klassenpfad in einer Eigenschaft mit dem outputPropertyParameter speichern .

Andrew
quelle
1

Hier ist ein awk-Skript zum Weiterleiten mvn dependency:list:

mvn dependency:list | awk -f mvnfmt.awk

Sie können, | sortwenn Sie nach Namen sortieren oder | tr '\n' ':'in einen Klassenpfad formatieren möchten .

mvnfmt.awk ist:

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]
}   
Matthieu
quelle