змусити Maven копіювати залежності в target / lib


252

Як отримати так, щоб залежність від виконання мого проекту була скопійована в target/libпапку?

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


Навіщо вам це потрібно? Який тип вашого проекту Maven? баночка?
Олександр Віктоор

Тип мого проекту Maven - JAR. Мені це потрібно, тому що існує велика кількість залежностей, і я намагаюся розгорнути банку як виконуваний файл.
Майкл

2
Застереження щодо збірок - якщо у вас є пакети / класи, що перекриваються між депами, ви, мабуть, будете погано провести час.
деманяк

Відповіді:


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
Якщо ви хочете, щоб це відбувалося постійно, зніміть обгортки <profiles> ... <profile> і зробіть тег <build> трохи під <project>
Dan Halbert

3
@Georgy це не копіює банки в lib /, але включає класи в складеному проекті
Midhat

5
Це добре, але це і копіювання тестових залежностей. Додаю до себе excludeScopeваріант ( maven.apache.org/plugins/maven-dependency-plugin/… ).
Альфонсо Нішікава

Працюйте добре, але не потрібно розміщувати тег збірки всередині тегів профілю.
Жульєн БРЕНЕЛЬЄР

2
Примітка: <excludeScope>test</excludeScope>йде всередину configurationвузла.
Джессі Чісгольм

84

Найкращий підхід залежить від того, що ви хочете зробити:

  • Якщо ви хочете об'єднати свої залежності у файл WAR або EAR, просто встановіть тип упаковки вашого проекту на EAR або WAR. Мейвен з'єднає залежності в потрібне місце.
  • Якщо ви хочете створити файл JAR, який включає ваш код разом із усіма вашими залежностями, то використовуйте плагін збірки з дескриптором jar-with-зависимостей . Maven генерує повний файл JAR з усіма своїми класами плюс класи від будь-яких залежностей.
  • Якщо ви хочете просто перетягнути ваші залежності в цільовий каталог інтерактивно, тоді скопіюйте свій додаток для залежності, щоб скопіювати ваші файли.
  • Якщо ви хочете скористатися залежностями для якогось іншого типу обробки, вам, ймовірно, доведеться генерувати власний плагін. Існують API для отримання списку залежностей та їх розташування на диску. Вам доведеться взяти його звідти ...

80
mvn install dependency:copy-dependencies 

Для мене працює каталог директорій залежностей, створений у цільовій папці. Люблю це!


35

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

Сподіваюсь, це допомагає.


15
Крім того, ви можете використовувати $ {project.build.directory} / lib, а не $ {basicir} / target / lib
Cuga

31

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

Повний приклад пам’яті:

<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-залежність-плагін (цілі "копіювати залежності", "розпакувати") не підтримується m2e. :-(
PM

@Gobliins використовує $ {project.build.directory} / lib замість $ {targetdirectory}
Divyang Shah

24

Якщо ви хочете робити це періодично (і, таким чином, не хочете змінювати свою POM), спробуйте цей командний рядок:

mvn залежність: copy-зависимости -DoutputDirectory = $ {project.build.directory} / lib

Якщо опустити останній аргумент , залежності розміщуються target/dependencies.


Дякую! це найпростіший спосіб просто скопіювати файли, необхідні проекту, в папку кудись, щоб ви могли скопіювати їх десь в іншому місці, якщо це необхідно, наприклад, проект, який не базується на комп'ютері. Зауважте, що, звичайно, ви можете просто перейти в папку з твердим кодом, яку ви можете використовувати, наприкладmvn dependency:copy-dependencies -DoutputDirectory=./lib
Brad Parks

Ви можете це зробити з 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>

@Thomas Я думаю , що це maven clean install, то ви знайдете libвtarget
Searene

1
що я повинен зробити, щоб скопіювати лише 1 залежність?
Алан Донізете

<classpathPrefix> lib / </classpathPrefix> мені дуже допоміг. Дякую!
Мартін Пабст

installprocess-resourcesbuild
Замінив

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, додайте властивість System з назвою outputDirectory, тобто

    -DoutputDirectory=${project.build.directory}/lib

7

припущення

  • ви не хочете змінювати pom.xml
  • ви не хочете провести тестові показники (наприклад, junit.jar) або забезпечені залежності (наприклад, wlfullclient.jar)

ось історія, яка працювала на мене:

mvn залежність установки: залежності від копіювання -DincludeScope = час виконання -DoutputDirectory = target / lib

5

Якщо ви хочете доставити пакет вашої банку додатків разом з усіма його залежностями та деякими сценаріями для виклику MainClass, подивіться на додаток appassembler-maven-plugin .

Наведена нижче конфігурація створить сценарії для запуску програми для Windows та Linux (із згенерованим контуром, що посилається на всі банки залежностей, завантажте всі залежності (у папку lib нижче цілі / 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>

2

Якщо ви зробите свій проект, війна або вуха типу «кавалер» буде копіювати залежності.



1

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

(1) У пам’яті, під <build> <додатки> я включив:

<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: збірка створила потрібний мій проект-0.1-SNAPSHOT-jar-with-зависимостtions.jar у цільовому каталозі проекту.

(3) Я керував JAR за допомогою java -jar my-project-0,1-SNAPSHOT-jar-with-зависимоtions.jar


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

1

Це важке рішення для вбудовування важких залежностей, але плагін Maven’s Assembly робить фокус для мене.

@ Відповідь багатого продавця має працювати, хоча для більш простих випадків вам потрібен лише цей уривок із посібника з використання :

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

Вам просто довелося додати основні залежності в властивості проекту> збірка розгортання.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.