Maven: загрузить артефакт и его копии в определенный каталог

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

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

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

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

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


person Steven    schedule 28.02.2011    source источник
comment
Можете ли вы создать проект, который использует их как зависимости, перемещает их и создает собственный артефакт с этими jar-файлами?   -  person corsiKa    schedule 28.02.2011
comment
Я полагаю, что да, но это не совсем правильно. Должен быть способ загрузить артефакт и его копии напрямую, не так ли?   -  person Steven    schedule 28.02.2011
comment
Я абсолютно согласен. Это не кажется правильным. И последнее, что кому-либо нужно, это что-то, что работает, пока мы не найдем лучший способ, потому что вы навсегда застрянете с кладжем. Но если ничего не помогает... :)   -  person corsiKa    schedule 01.03.2011


Ответы (3)


Используйте плагин сборки maven, чтобы упаковать дополнительную «банку с зависимостями» в 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-файл со всеми зависимостями.

person DaShaun    schedule 02.03.2011
comment
+1 - я сам использовал плагин сборки для упаковки JAR моего проекта с его зависимостями, когда мне нужно было распространять исполняемое настольное приложение; все зависимые JAR-файлы должны были присутствовать в пути к классам. Он очень прост в настройке и имеет отличную документацию. - person Jesse Webb; 12.02.2013

Вы можете комбинировать использование 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
person Ihor Kaharlichenko    schedule 29.05.2019
comment
Спасибо. Этот подход отлично работает для нас. Использование dependency:copy для получения POM разблокирует его. - person Dan Armstrong; 09.04.2020

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

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

person FrVaBe    schedule 28.02.2011