Подтвердить что ты не робот

Правильный способ объявить множественную область для зависимости от 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'. 

Каков правильный способ объявления области зависимостей в этом случае?

Спасибо

4b9b3361

Ответ 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>