In a prior post about when to use which scope for a Maven artifact, I left out the provided scope, because, as I said at the time, “I don’t get as confused about that one so I left it out.” I spoke too soon. : )
When I said that, I was only thinking of which classpath(s) the artifact would available to in its immediate project. But there are two additional concerns besides the classpath availability: whether the artifact will be built into the resulting (.war) target, and whether artifacts depending on this one will inherit the dependency. The latter issue is also affected by the <optional> tag.
The following table reflects my current understanding of how the scope and optionalness of a dependency affect:
- The classpath(s) in which the artifact is available;
- Whether the artifact is included in the war; and
- When artifact A declares a dependency on artifact D: whether artifacts declaring a dependency on artifact A will also transitively get a dependency on artifact D.
|Scope||Optional?||Classpaths in which artifact is available||Artifact included in war**||Dependency propagates transitively|
|(main) compile||(main) runtime||test*|
*Note that the “test” classpath is used both at test compile time and test runtime; it doesn’t seem to be possible to specify that an artifact should be available at test runtime but not test compile time.
**I don’t think it has to necessarily be packaged as war… trying to make a concrete example.