Maven can manage both internal and external dependencies. An external dependency for a Java project might be a library such as Plexus, the Spring Framework, or Log4J. An internal dependency is illustrated by a web application project depending on another project that contains service classes, model objects, or persistence logic. Example 3.3, “Project Dependencies” shows some examples of project dependencies.
Example 3.3. Project Dependencies
<project>
...
<dependencies>
<dependency>
<groupId>org.codehaus.xfire</groupId>
<artifactId>xfire-java5</artifactId>
<version>1.2.5</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.4</version>
<scope>provided</scope>
</dependency>
</dependencies>
...
</project>
The first dependency is a compile dependency on the XFire
SOAP library from Codehaus. You would use this type of
dependency if your project depended on this library for compilation,
testing, and during execution. The second dependency is a
test-scoped dependency on JUnit. You would use a
test-scoped dependency when you need to reference this
library only during testing. The last dependency in Example 3.3, “Project Dependencies” is a dependency on the Servlet 2.4
API. The last dependency is scoped as a provided
dependency. You would use a provided scope when the application you are
developing needs a library for compilation and testing, but this library
is supplied by a container at runtime.
Example 3.3, “Project Dependencies” briefly introduced three of the
five dependency scopes: compile,
test, and provided. Scope controls
which dependencies are available in which classpath, and which
dependencies are included with an application. Let’s explore each scope
in detail:
- compile
-
compileis the default scope; all dependencies arecompile-scoped if a scope is not supplied.compiledependencies are available in all classpaths, and they are packaged. - provided
-
provideddependencies are used when you expect the JDK or a container to provide them. For example, if you were developing a web application, you would need the Servlet API available on the compile classpath to compile a servlet, but you wouldn’t want to include the Servlet API in the packaged WAR; the Servlet API JAR is supplied by your application server or servlet container.provideddependencies are available on the compilation classpath (not runtime). They are not transitive, nor are they packaged. - runtime
-
runtimedependencies are required to execute and test the system, but they are not required for compilation. For example, you may need a JDBC API JAR at compile time and the JDBC driver implementation only at runtime. - test
-
test-scoped dependencies are not required during the normal operation of an application, and they are available only during test compilation and execution phases. - system
-
The
systemscope is similar toprovidedexcept that you have to provide an explicit path to the JAR on the local file system. This is intended to allow compilation against native objects that may be part of the system libraries. The artifact is assumed to always be available and is not looked up in a repository. If you declare the scope to besystem, you must also provide thesystemPathelement. Note that this scope is not recommended (you should always try to reference dependencies in a public or custom Maven repository).
