Правильный способ объявить множественную область для зависимости от Maven?
Например, у меня есть зависимость, которую я хочу использовать в области test
(так, чтобы она находилась в пути к классу при выполнении модульных тестов) и в области runtime
(чтобы я мог содержать это в WAR/EAR/другая упаковка для развертывания, но не влияет на поиск транзитивной зависимости для зависимых артефактов).
Реальный пример жизни - это JAR-системы реализации SLF4J (например, Logback), я хочу, чтобы он существовал в classpath, когда я запускаю тест, и хочу, чтобы он был включен в мою WAR/EAR, но я не хочу, чтобы проект зависел в моем проекте включить это в переходный поиск зависимостей.
Я пытался использовать <scope>test,runtime</scope>
, но в Maven 3 он предупреждал меня о
[WARNING] 'dependencies.dependency.scope' for org.slf4j:jcl-over-slf4j:jar
must be one of [provided, compile, runtime, test, system] but is 'test,runtime'.
Каков правильный способ объявления области зависимостей в этом случае?
Спасибо
Ответы
Ответ 1
Область выполнения также делает артефакт доступным для тестового пути. Просто используйте runtime. (См. Документацию Maven .)
Чтобы избежать транзитивности зависимостей, также сделайте optional с помощью <optional>true</optional>
:
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback</artifactId>
<version>0.5</version>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
Ответ 2
Вы можете определить только одно значение области для тега <scope/>
.
Я боюсь, что то, что вы хотели бы сделать, не может быть достигнуто просто с помощью области. Если вы определяете область test
, она будет доступна только во время тестов; если вы определяете область предоставления, это означает, что вы ожидаете, что зависимость для вашего проекта будет разрешена и использована во время компиляции и тестирования, но она не будет включена в ваш файл WAR. В любом случае, это не то, что вы хотели бы.
Поэтому я бы порекомендовал вам взглянуть на maven-assembly-plugin, с помощью которого вы можете его достичь, но по-прежнему потребуются некоторые играя вокруг.
Ответ 3
Объявление зависимости с scope runtime
гарантирует, что библиотека не будет доступна во время компиляции.
Объявление зависимости как optional приводит к перерыву в процессе разрешения зависимостей; проекты, зависящие от ваших библиотек, должны будут явно включать сами зависимости.
Таким образом, правильный способ объявить это будет:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.7.13</version>
<scope>runtime</scope>
<optional>true</optional>
</dependency>