Maven: скачать артефакт и его файлы в определенный каталог - PullRequest
7 голосов
/ 28 февраля 2011

Я должен что-то упустить. Я искал и искал, играл и возился, и до сих пор не могу понять, как сделать следующее с Maven:

Я хотел бы загрузить артефакт и все его зависимости (и транзитивные зависимости) с нашего внутреннего сервера Nexus в указанное пользователем местоположение. Идея заключается в том, чтобы позволить человеку, который развертывает решение в рабочей среде, таким образом, чтобы он мог легко получить все необходимые ему файлы JAR в одном месте.

Есть зависимость: получить, и это близко, но без сигары. С помощью зависимости: получить все артефакты загружаются в локальный репозиторий mvn в каталогах в соответствии с groupId и artifactId каждого артефакта. Это НЕ то, что я хочу, потому что тогда вам придется тащиться по всем этим каталогам, чтобы добраться до фляг. Я хочу, чтобы все файлы были загружены в один каталог, чтобы они были в одном месте.

Тогда есть зависимость: копия-зависимости. Это снова делает почти то, что я хочу; он копирует все глубины артефакта в цель / зависимость. Две проблемы с этим: 1) Вам нужно иметь pom.xml; вы не можете указать произвольные координаты, как вы можете с помощью зависимости: получить, и 2) зависимости: копирование-зависимости не копирует сам главный артефакт в цель / зависимости.

Должен быть лучший способ сделать это, но я не могу понять, где еще искать решение. Подводя итог, я хочу иметь возможность дать кому-то набор maven координат (groupId: artifactId: version) и наш внутренний URL Nexus, и пусть они загружают все с одной командой в каталог по своему выбору.

Ответы [ 3 ]

1 голос
/ 02 марта 2011

Используйте плагин сборки maven, чтобы упаковать дополнительный «jar с зависимостями» в ZIP-файл, который включает в себя все.

http://maven.apache.org/plugins/maven-assembly-plugin/descriptor-refs.html

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
  <!-- TODO: a jarjar format would be better -->
  <id>jar-with-dependencies</id>
  <formats>
    <format>jar</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <dependencySets>
    <dependencySet>
      <outputDirectory>/</outputDirectory>
      <useProjectArtifact>true</useProjectArtifact>
      <unpack>true</unpack>
      <scope>runtime</scope>
    </dependencySet>
  </dependencySets>
</assembly>

Тогда пользователь может просто запросить <type>zip</type>, в дополнение к обычным 'maven координатам', чтобы получить zip-файл со всеми зависимостями.

0 голосов
/ 29 мая 2019

Вы можете комбинировать использование dependency:copy и dependency:copy-dependencies для достижения своей цели.

Идея проста:

  1. Используйте dependency:copy, чтобы получить pom.xml вашего начального артефакта.
  2. Используйте dependency:copy-dependencies, передавая ему pom.xml, который вы выбрали на предыдущем шаге, чтобы получить все зависимости исходного артефакта.
  3. Снова используйте dependency:copy, чтобы получитьсам начальный артефакт.
#!/bin/sh

if [ "$#" -ne 2 ]; then
    echo "Usage: $(basename $0) <artifact> <directory>" > /dev/stderr
    exit 1
fi

ARTIFACT="$1"
OUTPUT="$2"

mkdir -p "$OUTPUT"

TMP=$(mktemp -d)
trap 'rm -rf "$TMP"' EXIT

mvn dependency:copy              "-DoutputDirectory=${TMP}"    "-Dartifact=${ARTIFACT}:pom"

POM=$(find "$TMP" -type f)

mvn dependency:copy              "-DoutputDirectory=${OUTPUT}" "-Dartifact=${ARTIFACT}"
mvn dependency:copy-dependencies "-DoutputDirectory=${OUTPUT}" -f "$POM" -DincludeScope=runtime

Сохранить как download-jars и использовать так:

download-jars org.apache.hadoop:hadoop-aws:2.7.3 /tmp/jars
0 голосов
/ 01 марта 2011

Если вы «хотите дать кому-то набор maven координат», лучше всего поместить их в специальный файл pom.xml (вы должны записать его где угодно). Этот pom не является pom вашего "главного артефакта", но имеет "главный артефакт" в качестве зависимости. Тип упаковки может быть pom, так как этот проект не создаст саму артефакт.

Затем используйте решение dependency:copy-dependencies, которое вы уже оценили, и вы получите все необходимые зависимости. ИМХО элегантное и простое решение. Я не знаю ничего лучше.

...