Совокупные зависимости в многомодульном проекте Maven

Я пытаюсь выяснить, как объединить мои maven-зависимости в многомодульный проект. Например, если у меня есть:

root pom/project1
root pom/project2

и я бегу mvn dependency:copy-dependenciesЯ в конечном итоге с зависимостями в:

root pom/project1/target/dependency
root pom/project2/target/dependency

Что я действительно хочу, так это то, что, если я запущу команду mvn в корневой папке pom, все зависимости будут скопированы в root pom/dependency, Есть ли свойство maven, которое дает мне выходной каталог корневого pom? (похожий на ${project.build.directory})? Я понимаю, что могу просто скопировать все папки зависимостей в одно и то же место после факта, но я надеялся на что-то более чистое.

2 ответа

Решение

Вам нужно будет настроить плагин зависимостей для копирования зависимостей в определенное место. Это может быть сделано outputDirectory свойство конфигурации.

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-dependency-plugin</artifactId>
   <executions>
      <execution>
         <id>copy-dependencies</id>
         <phase>package</phase>
         <goals>
            <goal>copy-dependencies</goal>
         </goals>
         <configuration>
              <outputDirectory>${outputDir}</outputDirectory>
         </configuration>
      </execution>
   </executions>
</plugin>

Но если вы пытаетесь сделать это для распространения, я бы порекомендовал вам создать сборку с помощью подключаемого модуля maven.

В документации сказано:

Плагин сборки для Maven 2.0 в первую очередь предназначен для того, чтобы пользователи могли объединять выходные данные проекта вместе с его зависимостями, модулями, документацией сайта и другими файлами в один распространяемый архив.

Что я действительно хочу, так это то, что, если я запущу команду mvn в корневой папке pom, все зависимости будут скопированы в корневую папку pom / dependency. Есть ли свойство maven, которое дает мне выходной каталог корневого pom? (похожий на ${project.build.directory})?

Нет, потому что модули не должны знать об этом.

Я понимаю, что могу просто скопировать все папки зависимостей в одно и то же место после факта, но я надеялся на что-то более чистое.

Способ Maven будет использовать плагин сборки Maven и пользовательский дескриптор. Но если вы не знакомы с плагином сборки Maven и его форматом дескриптора, это будет непросто.

Менее понятный, но более простой подход заключается в настройке подключаемого модуля Maven Dependency для копирования зависимостей в родительский проект с использованием относительного пути. Что-то вроде этого:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-dependency-plugin</artifactId>
  <version>2.1</version>
  <configuration>
    <outputDirectory>../root_pom/target/dependency</outputDirectory>
  </configuration>
</plugin>

Но, как я уже сказал, это создает тесную связь между модулями и корневым проектом, что совсем нехорошо (и я бы не пошел дальше, включив вызов цели как часть сборки, модули должны оставаться независимыми, и вы должны иметь возможность построить один модуль без "проверки" родителя).

Другие вопросы по тегам