Загрузка всех зависимостей maven в каталог НЕ в репозитории?


128

Я начал преобразовывать свой проект в maven, потому что мне нужно было использовать библиотеку, которая была распространена в двоичной форме только по maven, но после того, как я слишком долго бился головой о стену, я решил перестать причинять себе вред и просто использовать Муравей. Я бы хотел, чтобы maven загрузил jar-файл и все его транзитивные зависимости в каталог по моему выбору, чтобы я мог просто зарегистрировать их в своем SCM, как обычно, и снова стать счастливым разработчиком.
Есть идеи, как это легко сделать?


2
Рассмотрите возможность использования Ivy и получите необходимое вам транзитивное управление зависимостями с помощью Ant, которому вы доверяете. Или возьмите удар и используйте структуру каталогов Maven.
Дэйв Ньютон,

Вы пробовали Айви ?
Tomasz Nurkiewicz

5
Нет, но я потратил все свое терпение на переключение на этом этапе. Возможно, в следующий раз. Я хочу вернуться к кодированию. Можно ли это сделать с помощью maven?
chubbsondubs

Ответы:


261

Плагин Maven зависимости потенциально может решить вашу проблему.

Если у вас есть pomсо всеми указанными зависимостями вашего проекта, все, что вам нужно сделать, это запустить

mvn dependency:copy-dependencies

и вы найдете target/dependenciesпапку, заполненную всеми зависимостями, включая транзитивные.

Добавление ответа Густаво снизу : Чтобы загрузить источники зависимостей , вы можете использовать

mvn dependency:copy-dependencies -Dclassifier=sources

(через документ Apache Maven Dependency Plugin ).


1
Спасибо @Raghuram, я уже давно это искал.
eskalera

но что, если я хочу скопировать все зависимости в свое локальное репо? Для этого он предназначен? Зачем копировать, если он, возможно, уже находится в локальном репо. Все равно это местное.
ses

1
@ses Стандартная сборка maven (например, компиляция, тест, пакет, установка и т.д .; не уверен в проверке) уже по умолчанию копирует все зависимости в ваше локальное репо. Это не для этого. Вместо этого он предназначен для ситуаций, когда вам по какой-либо причине нужны зависимости вашего приложения. Я использую его прямо сейчас, чтобы проверить зависимые библиотеки на предмет избыточных определений API (например, некоторые библиотеки будут включать API Javax, которые могут конфликтовать с другими версиями того же API), но это также хорошо, если вашему приложению нужны его зависимости, упакованные с ним. для распространения или что-то еще.
Spanky Quigman

1
+1 за четкий, краткий и полезный ответ. Я просто прошел через тот же танец Maven, что и OP, и просто хотел получить зависимости файла JAR. Спасибо! Хотел бы я +10
Брэндон

@Raghuram Технически вы получаете все (разрешенные) артефакты в "target / dependencies". Кроме того, существует потенциальная проблема конфликта имен, поскольку координата "groupId" зависимости игнорируется. Другими словами, «dependency: copy-dependencies» не сохраняет структуру макета.
whaefelinger

8

Основываясь на ответе @Raghuram , я нахожу учебник по копированию зависимостей проекта , просто:

  1. Откройте файл проекта pom.xmlи найдите это:

    <project>
      [...]
      <build>
        <plugins>
          ...
        </plugins>
      </build>
      [...]
    </project>
    
  2. Затем замените на <plugins> ... </plugins>:

    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>3.0.0</version>
        <executions>
          <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
              <goal>copy-dependencies</goal>
            </goals>
            <configuration>
              <outputDirectory>${project.build.directory}/alternateLocation</outputDirectory>
              <overWriteReleases>false</overWriteReleases>
              <overWriteSnapshots>false</overWriteSnapshots>
              <overWriteIfNewer>true</overWriteIfNewer>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
    
  3. И вызовите maven в командной строке mvn dependency:copy-dependencies

После завершения он создаст папку target/dependencyво всех jarзависимостях от текущего каталога, в котором находится pom.xml.


Где набрать команду "mvn"? Щелкните правой кнопкой мыши maven-project-> Maven -> .. ??
Baked Inhalf

В командной строке терминала в папке, в которой находится pom.xmlфайл.
пользователь

1
Не сработало. Я думаю, что Maven устанавливается только как плагин. Мне также пришлось вручную загрузить Maven. Потом mvn dependency:copy-dependenciesсработало!
Baked Inhalf

8

Я наконец понял, как использовать Maven. В Eclipse создайте новый проект Maven.

Скачайте Maven, распакуйте архив, добавьте /binпапку в path.

Подтвердите установку из командной строки, запустив mvn -v(напечатает версию и путь установки java)

Перейдите в корневую папку проекта (где pom.xmlнаходится) и запустите:

mvn dependency:copy-dependencies

Все jar-файлы скачиваются в /target/dependency.

Чтобы установить другой выходной каталог:

mvn dependency:copy-dependencies -DoutputDirectory="c:\temp"

Теперь можно повторно использовать этот Maven-проект для всех загрузок зависимостей, изменив файл pom.xml

Добавьте jar-файлы в java-проект, выбрав путь сборки -> настроить путь сборки -> библиотеки -> добавить файлы JAR ..


1
Не обязательно быть проектом по затмению. Я открыл файл jar в Java Decompiler и скопировал pom.xml в пустую папку. Я позвонил, mvn dependency:copy-dependenciesкак вы описали, из этой папки и получил все зависимые файлы jar, красиво скопированные в одну папку.
Бернхард Дёблер


2

Пожалуйста, проверьте, есть ли у вас файлы конфигурации в ${MAVEN_HOME}/confкаталоге вроде settings.xml. Эти файлы переопределяют настройки из .m2папки, и из-за этого папка репозитория из .m2может быть не видна или удалена.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.