Как определить область зависимостей в Maven для включения библиотеки в компиляцию, запуск, тестирование, но не в сборку / упаковку?
Я создаю приложение Apache Spark, которое можно отлаживать как локально, так и развертывать в кластере. Чтобы сделать это, я должен определить его зависимость от spark-core (библиотеки Java/scala), чтобы выполнить следующее требование.
Включено в компиляцию (в противном случае компиляция завершается неудачно) Включено в прогон и тестирование (для локальной отладки и модульного тестирования) Включено в сборку (для развертывания в кластер с предоставленным spark-core, это уменьшение размера jar на 70M, я использую плагин maven-shade для генерации всеобъемлющего jar, так как есть некоторые проблемы с jar hell, которые не могут быть решены с помощью maven-assembly)
К сожалению, похоже, что пользовательская область не поддерживалась maven. Есть ли способ включить его с помощью некоторых плагинов?
3 ответа
Мы делаем именно это в нашей сборке Maven: исключаем сборку Spark из сборки сборки. Мы добавляем исключающее правило к maven-shade
конфигурация плагина.
<configuration>
<shadedArtifactAttached>true</shadedArtifactAttached>
<shadedClassifierName>jar-with-dependencies</shadedClassifierName>
<artifactSet>
<excludes>
<exclude>org.apache.spark:spark-assembly</exclude>
</excludes>
</artifactSet>
...
</configuration>
Вы можете использовать атрибут области (предоставляется) для зависимости.
Это очень похоже на компиляцию, но указывает, что вы ожидаете, что JDK или контейнер предоставят зависимость во время выполнения. Например, при создании веб-приложения для Java Enterprise Edition вы должны установить зависимость от API-интерфейса сервлета и связанных API-интерфейсов Java EE, так как веб-контейнер предоставляет эти классы. Эта область доступна только для пути к классам компиляции и тестирования и не является транзитивной.
Ссылка: http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html
например:
<dependency>
<groupId>group-a</groupId>
<artifactId>artifact-b</artifactId>
<version>1.0</version>
<type>bar</type>
<scope>provided</scope>
</dependency>
Вы должны создать 2 профиля. 1 для вашей идеи с помощью spark в области компиляции (по умолчанию), другой, используемый во время сборки (с предоставленной областью действия).
<profiles>
<profile>
<id>default-without-spark</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
</profile>
<profile>
<id>dev</id>
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
</dependency>
</dependencies>
</profile>
</profiles>
Вы получите то, что вы хотите, без недостатка решения @maasg (все переходные зависимости искры добавлены к вашему окончательному банку)