Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Correct way to declare multiple scope for Maven dependency?

Tags:

maven

maven-3

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?

like image 451
Adrian Shum Avatar asked Jan 30 '13 10:01

Adrian Shum


People also ask

What are the different scopes for Maven dependency?

Maven provides six scopes i.e. compile , provided , runtime , test , system , and import .

What is scope in dependency in POM XML?

This scope is used to limit the transitivity of a dependency, and also to affect the classpath used for various build tasks. compile. This is the default scope, used if none is specified. Compile dependencies are available in all classpaths of a project.

What is scope test </ scope in Maven?

test This scope indicates that the dependency is not required for normal use of the application, and is only available for the test compilation and execution phases. This scope is not transitive. system This scope is similar to provided except that you have to provide the JAR which contains it explicitly.


2 Answers

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> 
like image 167
Christopher Avatar answered Oct 23 '22 01:10

Christopher


You can only define one scope value per <scope/> tag.

I'm afraid what you'd like to do cannot be achieved by merely using a scope. If you define a scope of test, it will only be available during tests; if you define a scope of provided, that would mean that you would expect that dependency for your project to be resolved and used during both compilation and tests, but it will not be included in your WAR file. Either way, it's not what you would want.

Therefore, I would recommend you have a look at the maven-assembly-plugin, with which you can achieve it, but it will still require some playing around.

like image 32
carlspring Avatar answered Oct 23 '22 03:10

carlspring