Заставьте Maven копировать зависимости в target / lib

Как мне скопировать зависимости времени выполнения моего проекта в папку target/lib?

Как и сейчас, после mvn clean install папка target содержит только jar моего проекта, но ни одну из зависимостей времени выполнения.


person Michael    schedule 18.09.2008    source источник
comment
Зачем вам это ? Какой у вас тип проекта maven? банка ?   -  person Alexandre Victoor    schedule 19.09.2008
comment
Тип моего проекта maven - JAR. Мне это нужно, потому что существует много зависимостей, и я пытаюсь развернуть банку как исполняемый файл.   -  person Michael    schedule 19.09.2008
comment
Осторожно со сборками - если у вас есть перекрывающиеся пакеты / классы между deps, у вас, вероятно, будут плохие времена.   -  person demaniak    schedule 08.10.2015


Ответы (15)


Это работает для меня:

<project>
  ...
  <profiles>
    <profile>
      <id>qa</id>
      <build>
        <plugins>
          <plugin>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
              <execution>
                <phase>install</phase>
                <goals>
                  <goal>copy-dependencies</goal>
                </goals>
                <configuration>
                  <outputDirectory>${project.build.directory}/lib</outputDirectory>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>
</project>
person Georgy Bolyuba    schedule 15.06.2009
comment
Если вы хотите, чтобы это происходило постоянно, удалите оболочки ‹profiles› ... ‹profile› и сделайте тег ‹build› под ‹project› - person Dan Halbert; 06.11.2012
comment
@Georgy это не скрывает банки в lib /, но включает классы в скомпилированный проект - person Midhat; 26.11.2012
comment
Это нормально, но также копируются тестовые зависимости. Я добавляю к себе параметр excludeScope (maven.apache. org / plugins / maven-dependency-plugin /). - person Alfonso Nishikawa; 09.08.2013
comment
Работает хорошо, но не обязательно размещать тег сборки внутри тегов профиля. - person Julien BRENELIERE; 11.02.2014
comment
Примечание: <excludeScope>test</excludeScope> находится внутри узла configuration. - person Jesse Chisholm; 23.11.2016
comment
Хотел проголосовать, но узнал, что сделал это 2 года назад :) - person ; 19.06.2018
comment
Может быть, было бы более подходящим, если бы фаза была package вместо install - person Searene; 23.08.2018
comment
@JesseChisholm спасибо, что ваше решение сработало - person BraveBoy; 02.03.2021

mvn install dependency:copy-dependencies 

У меня работает с каталогом зависимостей, созданным в целевой папке. Нравится это!

person user3286149    schedule 08.02.2014
comment
Спасибо за такой простой вариант. Вместо этого я использовал цель пакета, но в остальном сделал то, что искал. - person jla; 16.07.2020

Лучший подход зависит от того, что вы хотите сделать:

  • Если вы хотите связать свои зависимости в файл WAR или EAR, просто установите тип упаковки вашего проекта EAR или WAR. Maven свяжет зависимости в нужное место.
  • Если вы хотите создать файл JAR, включающий ваш код вместе со всеми вашими зависимостями, используйте плагин сборки с дескриптором jar-with-dependencies. Maven сгенерирует полный JAR-файл со всеми вашими классами плюс классы из любых зависимостей.
  • Если вы хотите просто перетащить свои зависимости в целевой каталог в интерактивном режиме, используйте плагин зависимости для копирования файлов.
  • Если вы хотите получить зависимости для какого-либо другого типа обработки, вам, вероятно, потребуется создать свой собственный плагин. Существуют API-интерфейсы для получения списка зависимостей и их расположения на диске. Придется брать оттуда ...
person John Stauffer    schedule 19.09.2008

Взгляните на плагин зависимостей Maven, в частности, на dependency: copy-dependencies цель. Взгляните на пример под заголовком dependency: mojo copy-dependencies. Установите для свойства конфигурации outputDirectory значение $ {basedir} / target / lib (я думаю, вам придется протестировать).

Надеюсь это поможет.

person Travis B. Hartwell    schedule 19.09.2008
comment
В качестве альтернативы вы можете использовать $ {project.build.directory} / lib, а не $ {basedir} / target / lib. - person Cuga; 06.07.2010

Простое и элегантное решение для случая, когда нужно скопировать зависимости в целевой каталог без использования каких-либо других этапов maven (я нашел это очень полезным при работе с Vaadin).

Полный пример pom:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>groupId</groupId>
    <artifactId>artifactId</artifactId>
    <version>1.0</version>

    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.1.1</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-dependency-plugin</artifactId>
                    <executions>
                        <execution>
                            <phase>process-sources</phase>

                            <goals>
                                <goal>copy-dependencies</goal>
                            </goals>

                            <configuration>
                                <outputDirectory>${targetdirectory}</outputDirectory>
                            </configuration>
                        </execution>
                    </executions>
            </plugin>
        </plugins>
    </build>
</project>

Затем запустите mvn process-sources

Зависимости файлов jar можно найти в /target/dependency

person ruhsuzbaykus    schedule 30.06.2011
comment
maven-dependency-plugin (копирование-зависимости целей, распаковка) не поддерживается m2e. :-( - person P.M; 27.01.2012
comment
@Gobliins используют $ {project.build.directory} / lib вместо $ {targetdirectory}. - person Divyang Shah; 12.09.2017

Если вы хотите делать это время от времени (и, следовательно, не хотите менять свой POM), попробуйте эту командную строку:

mvn dependency:copy-dependencies -DoutputDirectory=${project.build.directory}/lib

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

person Duncan Jones    schedule 22.08.2014
comment
Благодарность! это самый простой способ просто скопировать библиотеки, которые потребуются проекту, в какую-нибудь папку, чтобы вы могли скопировать их в другое место, например, проект, не основанный на maven. Обратите внимание, что, конечно, вы можете просто передать жестко запрограммированную папку для использования, например, mvn dependency:copy-dependencies -DoutputDirectory=./lib - person Brad Parks; 15.05.2015
comment
А можно из pom.xml? - person Gobliins; 19.10.2015

Все, что вам нужно, это следующий фрагмент внутри build/plugins pom.xml:

<plugin>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <phase>prepare-package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.build.directory}/lib</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

Вышеупомянутое будет выполняться в фазе package, когда вы запустите

mvn clean package

И зависимости будут скопированы в outputDirectory, указанный во фрагменте, то есть в этом случае lib.

Если вы хотите делать это время от времени, никаких изменений в pom.xml не требуется. Просто запустите следующее:

mvn clean package dependency:copy-dependencies

Чтобы переопределить местоположение по умолчанию, которым является ${project.build.directory}/dependencies, добавьте системное свойство с именем outputDirectory, т. Е.

    -DoutputDirectory=${project.build.directory}/lib
person isapir    schedule 24.12.2017

Попробуйте что-то вроде этого:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
    <archive>
        <manifest>  
            <addClasspath>true</addClasspath>
            <classpathPrefix>lib/</classpathPrefix>
            <mainClass>MainClass</mainClass>
        </manifest>
    </archive>
    </configuration>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.4</version>
    <executions>
        <execution>
            <id>copy</id>
            <phase>install</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>
                    ${project.build.directory}/lib
                </outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>
person adjablon    schedule 01.05.2012
comment
@ Томас, я думаю, это maven clean install, тогда ты найдешь lib в target - person Searene; 15.01.2017
comment
что мне нужно сделать, чтобы скопировать только одну зависимость? - person Alan Donizete; 31.03.2017
comment
‹ClasspathPrefix› lib / ‹/classpathPrefix› мне очень помог. Спасибо! - person Martin Pabst; 14.04.2017
comment
Заменил бы фазу install на process-resources, чтобы зависимости копировались до выполнения build цели - person Vyacheslav Cotruta; 29.09.2019

предполагая

  • вы не хотите изменять pom.xml
  • вам не нужны тестовые области (например, junit.jar) или предоставленные зависимости (например, wlfullclient.jar)

вот что сработало для меня:

mvn install dependency:copy-dependencies -DincludeScope=runtime -DoutputDirectory=target/lib
person mambolis    schedule 24.11.2016

Если вы хотите доставить пакет jar-файла приложения вместе со всеми его зависимостями и некоторыми сценариями для вызова MainClass, посмотрите appassembler-maven-plugin.

Следующая конфигурация сгенерирует сценарии для Windows и Linux для запуска приложения (со сгенерированным путем, ссылающимся на все jar-файлы зависимостей, загрузите все зависимости (в папку lib ниже target / appassembler). плагин сборки можно затем использовать для упаковки всего каталога appassembler в zip, который устанавливается / развертывается вместе с jar для репозиторий.

  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>appassembler-maven-plugin</artifactId>
    <version>1.0</version>
    <executions>
      <execution>
        <id>generate-jsw-scripts</id>
        <phase>package</phase>
        <goals>
          <goal>generate-daemons</goal>
        </goals>
        <configuration>
          <!--declare the JSW config -->
          <daemons>
            <daemon>
              <id>myApp</id>
              <mainClass>name.seller.rich.MyMainClass</mainClass>
              <commandLineArguments>
                <commandLineArgument>start</commandLineArgument>
              </commandLineArguments>
              <platforms>
                <platform>jsw</platform>
              </platforms>              
            </daemon>
          </daemons>
          <target>${project.build.directory}/appassembler</target>
        </configuration>
      </execution>
      <execution>
        <id>assemble-standalone</id>
        <phase>integration-test</phase>
        <goals>
          <goal>assemble</goal>
        </goals>
        <configuration>
          <programs>
            <program>
              <mainClass>name.seller.rich.MyMainClass</mainClass>
              <!-- the name of the bat/sh files to be generated -->
              <name>mymain</name>
            </program>
          </programs>
          <platforms>
            <platform>windows</platform>
            <platform>unix</platform>
          </platforms>
          <repositoryLayout>flat</repositoryLayout>
          <repositoryName>lib</repositoryName>
        </configuration>
      </execution>
    </executions>
  </plugin>
  <plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.2-beta-4</version>
    <executions>
      <execution>
        <phase>integration-test</phase>
        <goals>
          <goal>single</goal>
        </goals>
        <configuration>
          <descriptors>
            <descriptor>src/main/assembly/archive.xml</descriptor>
          </descriptors>
        </configuration>
      </execution>
    </executions>
  </plugin> 

Дескриптор сборки (в src / main / assembly) для упаковки директивы в виде zip-архива будет:

<assembly>
  <id>archive</id>
  <formats>
    <format>zip</format>
  </formats>
  <fileSets>
    <fileSet>
     <directory>${project.build.directory}/appassembler</directory>
     <outputDirectory>/</outputDirectory>
    </fileSet>
  </fileSets>
</assembly>
person Rich Seller    schedule 19.09.2009

Если вы сделаете свой проект war или ear type, maven скопирует зависимости.

person Eduard Wirch    schedule 18.09.2008

Это тяжелое решение для встраивания тяжелых зависимостей, но плагин сборки Maven делает трюк для меня.

@ Ответ богатого продавца должен работать, хотя для более простых случаев вам понадобится только этот отрывок из руководство по использованию:

<project>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.2.2</version>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
person RubyTuesdayDONO    schedule 31.01.2012
comment
Ваш пример кода не решает проблему, он просто объединяет все в один JAR. Да, плагин сборки можно использовать для достижения этой цели, но не так. - person Duncan Jones; 22.08.2014
comment
Хотя при дальнейшем чтении, возможно, вы отвечаете на это комментарий. - person Duncan Jones; 22.08.2014
comment
это было так давно, что я действительно не помню ... плюс я стал довольно ржавым с тех пор, как сосредоточился на администрировании Linux в моей последней фирме - но спасибо за отзывы! - person RubyTuesdayDONO; 22.08.2014

Вы можете использовать плагин Shade, чтобы создать uber jar, в котором вы может объединять все ваши сторонние зависимости.

person Brian Matthews    schedule 18.09.2008

Просто чтобы вкратце изложить то, что уже было сказано. Я хотел создать исполняемый файл JAR, который включал бы мои зависимости вместе с моим кодом. Это сработало для меня:

(1) В pom, в разделе ‹build› ‹plugins›, я включил:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.2-beta-5</version>
    <configuration>
        <archive>
            <manifest>
                <mainClass>dk.certifikat.oces2.some.package.MyMainClass</mainClass>
            </manifest>
        </archive>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
</plugin>

(2) Запуск сборки компиляции mvn: сборка создала желаемый my-project-0.1-SNAPSHOT-jar-with-dependencies.jar в целевом каталоге проекта.

(3) Я запустил JAR с java -jar my-project-0.1-SNAPSHOT-jar-with-dependencies.jar.

person OleVV    schedule 22.09.2010
comment
основной класс не найден в (3) - person Thomas; 08.11.2013

Если у вас возникли проблемы, связанные с зависимостями, не отображаемыми в файле WEB-INF / lib при работе на сервере Tomcat в Eclipse, взгляните на это:

ClassNotFoundException DispatcherServlet при запуске Tomcat (зависимости Maven не копируются в wtpweb)

Вам просто нужно было добавить зависимости Maven в Project Properties> Deployment Assembly.

person hemetsu    schedule 17.05.2011