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


252

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

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


Зачем вам это ? Какой тип вашего проекта Maven? баночка?
Александр Виктор

Тип моего проекта Maven является JAR. Мне это нужно, потому что есть много зависимостей, и я пытаюсь развернуть jar как исполняемый файл.
Майкл

2
Осторожно со сборками - если у вас есть перекрывающиеся пакеты / классы между deps, у вас, вероятно, будет плохое время.
Деманьяк

Ответы:


260

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

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

11
Если вы хотите, чтобы это происходило постоянно, удалите обертки <profile> ... <profile> и сделайте так, чтобы тег <build> находился чуть ниже <project>
Дэн Халберт,

3
@ Георгий, это не вызывает сомнений в lib /, но включает классы в скомпилированном проекте
Midhat

5
Это нормально, но копирует тестовые зависимости тоже. Я добавляю себе excludeScopeопцию ( maven.apache.org/plugins/maven-dependency-plugin/… ).
Альфонсо Нишикава

Работают хорошо, но не обязательно размещать тег сборки внутри тегов профиля.
Жюльен БРЕНЕЛЬЕР

2
Примечание: <excludeScope>test</excludeScope>идет внутри configurationузла.
Джесси Чисхолм

84

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

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

80
mvn install dependency:copy-dependencies 

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


35

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

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


15
В качестве альтернативы вы могли бы использовать $ {project.build.directory} / lib вместо $ {basedir} / target / lib
Cuga

31

Простое и элегантное решение для случая, когда нужно скопировать зависимости в целевой каталог, не используя другие фазы 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


1
Плагин maven-dependency-plugin (цели "copy-dependencies", "unpack") не поддерживается m2e. :-(
PM

@Gobliins использует $ {project.build.directory} / lib вместо $ {targettdirectory}
Дивьянг Шах

24

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

mvn зависимость: копия-зависимости -DoutputDirectory = $ {project.build.directory} / lib

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


Спасибо! это самый простой способ просто скопировать библиотеки, которые потребуются проекту, в папку где-нибудь, чтобы вы могли скопировать их в другое место, если это необходимо, например, проект не на основе maven. Обратите внимание, что, конечно, вы можете просто передать жестко закодированную папку, чтобы использовать ее, если хотите, например,mvn dependency:copy-dependencies -DoutputDirectory=./lib
Брэд Паркс

Можете ли вы сделать это из pom.xml?
Гоблины

24

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

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

@ Томас Я думаю, что это maven clean install, тогда вы найдете libвtarget
Searene

1
Что мне нужно сделать, чтобы скопировать только 1 зависимость?
Алан Донизете

<classpathPrefix> lib / </ classpathPrefix> мне очень помог. Спасибо!
Мартин Пабст,

Заменили бы installфазу process-resourcesтак, чтобы зависимости копировались до build
запуска

20

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

<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

7

Пред- полагая

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

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

mvn установить зависимость: копия-зависимости -DincludeScope = время выполнения -DoutputDirectory = target / lib

5

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

Следующая конфигурация создаст сценарии для Window и 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>



1

Просто чтобы изложить то, что уже было сказано вкратце. Я хотел создать исполняемый файл 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


основной класс не найден в (3)
Томас

1

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

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

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

Ваш пример кода не решает проблему, он просто объединяет все в один JAR. Да, плагин сборки можно использовать для достижения этой цели, но не так.
Дункан Джонс

Хотя, при дальнейшем чтении, возможно, вы отвечаете на этот комментарий .
Дункан Джонс

это было так долго, что я действительно не помню ... плюс я стал довольно ржавым с тех пор, как сосредоточился на администрировании Linux в моей последней фирме - но спасибо за отзыв!
RubyTuesdayDONO

0

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

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

Вам просто нужно было добавить зависимости Maven в Свойства проекта> Сборка развертывания.

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