Search code examples
mavenmaven-3

Correct way to declare multiple scope for Maven dependency?


I have a dependency that I want to use in test scope (so that it is in the classpath when I am running unit tests), and in runtime scope (so that I can contain that in WAR/EAR/other packaging for deployment, but not affecting transitive dependency lookup for dependent artifacts).

A real life example is SLF4J's implementation JARs (e.g. Logback). I want it to exist in the classpath when I am running tests, and I want it to be included in my WAR/EAR, but I don't want project depending on my project to include that in transitive dependency lookup.

I tried to use <scope>test,runtime</scope> but Maven 3 produces a warning:

[WARNING] 'dependencies.dependency.scope' for org.slf4j:jcl-over-slf4j:jar 
must be one of [provided, compile, runtime, test, system] but is 'test,runtime'. 

What is the right way for declaring the dependency scope in such a case?


Solution

  • The runtime scope also makes the artifact available on the test classpath. Just use runtime. (See the Maven documentation.)

    To avoid having the dependency resolved transitively, also make it optional with <optional>true</optional>:

    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback</artifactId>
      <version>0.5</version>
      <scope>runtime</scope>
      <optional>true</optional>
    </dependency>