The Default Classpath

The surefire plugin builds the test classpath in the following order:

  1. The test-classes directory
  2. The classes directory
  3. The project dependencies
  4. Additional classpath elements

Additional Classpath Elements

If you need to put more stuff in your classpath when Surefire executes (e.g some funky resources or a container specific JAR), we normally recommend you add it to your classpath as a dependency. Consider deploying shared jars to a private remote repository for your organization.

But, if you must, you can use the additionalClasspathElements element to add custom resources/jars to your classpath. This will be treated as an absolute file system path, so you may want use ${basedir} or another property combined with a relative path. Note that additional classpath elements are added to the end of the classpath, so you cannot use these to override project dependencies or resources.

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.10</version>
        <configuration>
          <additionalClasspathElements>
            <additionalClasspathElement>path/to/additional/resources</additionalClasspathElement>
            <additionalClasspathElement>path/to/additional/jar</additionalClasspathElement>
          </additionalClasspathElements>
        </configuration>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

Removing Dependency Classpath Elements

Dependencies can be removed from the test classpath using the parameters classpathDependencyExcludes and classpathDependencyScopeExclude. A list of specific dependencies can be removed from the classpath by specifying the groupId:artifactId to be removed.

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.10</version>
        <configuration>
          <classpathDependencyExcludes>
            <classpathDependencyExcludes>org.apache.commons:commons-email</classpathDependencyExcludes>
          </classpathDependencyExcludes>
        </configuration>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

Dependencies under a certain scope can be removed from the classpath using classpathDependencyScopeExclude. The valid values for the dependency scope exclude are defined by org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter.

  • compile - system, provided, compile
  • runtime - compile, runtime
  • test - system, provided, compile, runtime, test
    <project>
      [...]
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.10</version>
            <configuration>
              <classpathDependencyScopeExclude>runtime</classpathDependencyScopeExclude>
            </configuration>
          </plugin>
        </plugins>
      </build>
      [...]
    </project>