Список файлів jar залежностей у Maven


77

Чи можна за допомогою Maven 2 перерахувати залежності jar як лише імена файлів?

mvn dependency:build-classpath 

може перераховувати файли jar, але це включатиме повний шлях до їх розташування у моєму локальному сховищі. Мені, по суті, потрібен лише перелік імен файлів (або імен файлів, які скопійована мета залежностей від копіювання).

Тож список, який мені потрібен, буде приблизно таким

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

в ідеалі як властивість maven, але я гадаю, такий файл, як build-classpath, який може генерувати, підійде.

Я намагаюся зробити це, Bundle-ClassPathщоб записати файл MANIFEST.MF, що підтримується вручну, для пакета OSGi. (Вам не потрібно розуміти цей біт, щоб відповісти на запитання.)

Для уточнення: Питання не в тому, як записати заголовки маніфесту у файл MANIFEST.MF у банку (це легко погуглити). Я запитую про те, як отримати дані, які я хочу написати, а саме список, показаний вище.


просто надішліть виправлення для плагіна залежностей, і я застосую його до наступного випуску. Шлях до класу збірки - це найближче до того, що ви хочете, нам просто потрібно налаштувати параметри, щоб отримати бажаний результат.
Брайан Фокс,

Відповіді:


94

Ця команда створить дерево залежностей вашого проекту maven:

$ mvn dependency:tree

Я впевнений, що результат вам сподобається :-)


20

Найкраще, наскільки я можу зрозуміти, ви не можете отримати точно такий результат, без коми і без пробілів. Як через командний рядок, так і через файл pom.xml, плагін maven-dependency-плагін або CLI збиваються з толку, якщо ви вказали пробіли або '' (порожній рядок) як замінник або pathSeparatorабо fileSeparator. Отже, вас можуть змусити досягти чогось компромісного. Ти можеш

    залежність mvn: build-classpath -Dmdep.pathSeparator = ":" -Dmdep.prefix = '' -Dmdep.fileSeparator = ":" -Dmdep.outputFile = classpath

Однак це повинно отримати повний список, розділений '::'замість просто ',', але це працює. Якщо ви біжите:

    залежність mvn: build-classpath -Dmdep.pathSeparator = "@ REPLACEWITHCOMMA" -Dmdep.prefix = '' -Dmdep.fileSeparator = "@" -Dmdep.outputFile = classpath

і приєднати це до generate-resourcesфази та відфільтрувати цей ресурс пізніше, встановивши правильну властивість у process-resourcesфазі життєвого циклу, ви повинні мати можливість отримувати лише кому.

Ви можете переглянути повний перелік варіантів за адресою: http://maven.apache.org/plugins/maven-dependency-plugin/build-classpath-mojo.html


2
Чудова відповідь! Якщо ви використовуєте -Dmdep.pathSeparator = ',' -Dmdep.prefix = '.' -Dmdep.fileSeparator = '/' ви отримуєте розділений комами список відносних імен файлів a la ./file1.jar,./file2.jar, який потім уникає необхідності фільтрування.
Eero

17

Ось команда, яку ви просите

$ mvn dependency:tree

Для великих проектів може видавати багато тексту. Я припускаю, що ви хочете перевірити, що дерево залежностей містить певну залежність, тому вам не потрібен повний список.

Ось як можна фільтрувати вихідні дані в Windows:

$ mvn dependency:tree | findstr javax.persistence

І ось як ви можете це зробити в Linux:

$ mvn dependency:tree | grep javax.persistence

Maven спосіб фільтрувати дерево залежностей (працює в Windows cmd, MacOS та Linux):

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

Спосіб Maven (Windows PowerShell):

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

11

Власне, для остаточного списку банок просто використовуйте

mvn dependency:list

Що набагато простіше, ніж залежність: дерево, яке є надмірним, щоб просто отримати остаточний список, оскільки воно показує детальне перехідне дерево та вирішення конфліктів (з детальним описом).


2
І якщо ви хочете, щоб вони були відсортовані:mvn dependency:list -Dsort=true
mgarde

5

Ви дивились на проект Apache Felix ? Він має безліч плагінів, включаючи пакетний плагін, який повинен робити те, що ви хочете.

Крім того, ви пробували <addClasspath>тег з <manifestFile>? Це повинно мати бажаний ефект від об’єднання шляху до класу у ваш маніфест.

<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>

Я знаю про Apache Felix, але це робить не те, що мені потрібно, саме тому я роблю це вручну.
Сіндрі Траустасон

addClasspath додасть список jar до заголовка маніфесту Class-Path, я не бачу, щоб у документах maven-jar-plugin згадувалося про можливість вкласти шлях до класу в інші заголовки. Також Bundle-Classpath потребує не лише списку банок.
Сіндрі Траустасон

3

Можливо, я чогось тут пропускаю, але оскільки ви вже використовували залежності від копіювання, це схоже на те, що ви насправді шукаєте - це лише список файлів у вказаному каталозі.

Ant може зробити це за вас без проблем, як і сценарій оболонки.


Я згоден, я щойно це зробив .
Matthieu


1

Щоб додати виріз до існуючих відповідей, поточний плагін maven-dependency-плагін дозволяє зберегти шлях до класу до властивості з outputPropertyпараметром.


1

Ось сценарій awk для конвеєру mvn dependency:list:

mvn dependency:list | awk -f mvnfmt.awk

Ви можете, | sortякщо хочете відсортувати за назвою або | tr '\n' ':'відформатувати його до шляху до класу.

mvnfmt.awk це:

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]
}   
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.