Как определить область зависимостей в 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 (все переходные зависимости искры добавлены к вашему окончательному банку)

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