Maven má rozsahy (scope), kterými je možno ovlivnit, která závislosti se bude používat v které fázi maven buildu. Rozsah test znamená, že dané závislosti (knihovny) budou k dispozici během testovací fáze, ale jinak ne.
Jednoduchý příklad ukážu na knihovně TestNG, která se používá pro testování. Závislost v pom.xml vypadá následovně:
<dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>6.11</version> <scope>test</scope> </dependency>
Pokud budeme mít třídu AppTest v balíčku src/test/java a v ní tento test, který používá knihovnu TestNG:
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotEquals;
import org.testng.annotations.Test;
public class AppTest {
@Test
public void test() {
assertNotEquals("A", "B");
assertEquals(10, 10);
}
}
při spuštění buildu aplikace pomocí mavenu (mvn test, z Eclipse IDE Run As -> Maven test) proběhne vše v pořádku (knihovna TestNG je k dipozici, kód se zkompiluje a proběhne).
Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
Pokud bychom ale v naší netestové třídě v src/main/java z nějakého důvodu chtěli použít knihovnu TestNG.
import static org.testng.Assert.assertTrue;
public class App {
public static void main(String[] args) {
assertTrue(true);
}
}
nepůjde nám kód spustit a dostaneme tuto chybu:
Exception in thread "main" java.lang.NoClassDefFoundError: org/testng/Assert at App.main(App.java:10) Caused by: java.lang.ClassNotFoundException: org.testng.Assert at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 1 more
Knihovna TestNG není k dispozici (bude pouze ve fázi testů spouštěných mavenem) a kód nejde zkompilovat. Pokud v pom.xml zakomentujeme (nebo odstaníme) <scope>test</scope>, vše bude v pořádku.