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.