This is an automated email from the ASF dual-hosted git repository. tibordigana pushed a commit to branch SUREFIRE-1585-tibor2 in repository https://gitbox.apache.org/repos/asf/maven-surefire.git
The following commit(s) were added to refs/heads/SUREFIRE-1585-tibor2 by this push: new 1081e1a [SUREFIRE-1585] Align JUnit Platform version at runtime 1081e1a is described below commit 1081e1ae04df299427af152a464e50e2dc973478 Author: tibordigana <tibordig...@apache.org> AuthorDate: Sun Feb 24 11:00:23 2019 +0100 [SUREFIRE-1585] Align JUnit Platform version at runtime --- .../plugin/surefire/AbstractSurefireMojo.java | 13 +- .../surefire/SurefireDependencyResolver.java | 25 ++- .../plugin/surefire/AbstractSurefireMojoTest.java | 209 ++++++++++++++++++--- .../src/site/apt/examples/junit-platform.apt.vm | 45 ++++- 4 files changed, 241 insertions(+), 51 deletions(-) diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java index da68069..39e88c9 100644 --- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java +++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java @@ -96,7 +96,6 @@ import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; @@ -115,6 +114,7 @@ import static java.util.Collections.singletonList; import static java.util.Collections.singletonMap; import static org.apache.commons.lang3.StringUtils.substringBeforeLast; import static org.apache.commons.lang3.SystemUtils.IS_OS_WINDOWS; +import static org.apache.maven.artifact.ArtifactUtils.artifactMapByVersionlessId; import static org.apache.maven.plugin.surefire.SurefireDependencyResolver.isWithinVersionSpec; import static org.apache.maven.plugin.surefire.util.DependencyScanner.filter; import static org.apache.maven.plugin.surefire.SurefireHelper.replaceThreadNumberPlaceholders; @@ -2929,14 +2929,10 @@ public abstract class AbstractSurefireMojo } else if ( hasDependencyPlatformEngine( getPluginArtifactMap() ) ) { + Set<Artifact> pluginArtifacts = + dependencyResolver.resolvePluginArtifactOffline( getMojoArtifact() ).getArtifacts(); Map<String, Artifact> engineArtifacts = new HashMap<>( getPluginArtifactMap() ); - for ( Iterator<String> keys = engineArtifacts.keySet().iterator(); keys.hasNext(); ) - { - if ( keys.next().startsWith( "org.apache.maven.surefire:" ) ) - { - keys.remove(); - } - } + engineArtifacts.keySet().removeAll( artifactMapByVersionlessId( pluginArtifacts ).keySet() ); providerArtifacts.putAll( engineArtifacts ); alignVersions( providerArtifacts, engineArtifacts ); } @@ -2951,6 +2947,7 @@ public abstract class AbstractSurefireMojo addEngineByApi( engineGroupId, engineArtifactId, engineVersion, providerArtifacts, testDependencies ); } + providerArtifacts.keySet().removeAll( testDependencies.keySet() ); return new LinkedHashSet<>( providerArtifacts.values() ); } diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/SurefireDependencyResolver.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/SurefireDependencyResolver.java index 43f6c52..5c05a1f 100644 --- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/SurefireDependencyResolver.java +++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/SurefireDependencyResolver.java @@ -20,7 +20,6 @@ package org.apache.maven.plugin.surefire; */ import java.util.Iterator; -import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; @@ -42,6 +41,7 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; import static org.apache.maven.artifact.Artifact.SCOPE_TEST; +import static org.apache.maven.artifact.ArtifactUtils.artifactMapByVersionlessId; import static org.apache.maven.artifact.versioning.VersionRange.createFromVersionSpec; /** @@ -118,6 +118,11 @@ final class SurefireDependencyResolver } } + ArtifactResolutionResult resolvePluginArtifactOffline( Artifact artifact ) + { + return resolveArtifact( artifact, null ); + } + ArtifactResolutionResult resolvePluginArtifact( Artifact artifact ) { return resolveArtifact( artifact, pluginRemoteRepositories ); @@ -132,9 +137,17 @@ final class SurefireDependencyResolver { ArtifactResolutionRequest request = new ArtifactResolutionRequest() .setArtifact( artifact ) - .setRemoteRepositories( repositories ) .setLocalRepository( localRepository ) .setResolveTransitively( true ); + if ( repositories == null ) + { + request.setOffline( true ); + } + else + { + request.setRemoteRepositories( repositories ); + } + return repositorySystem.resolve( request ); } @@ -163,13 +176,7 @@ final class SurefireDependencyResolver @Nonnull Map<String, Artifact> getProviderClasspathAsMap( String providerArtifactId, String providerVersion ) { - Map<String, Artifact> cpArtifactsMapping = new LinkedHashMap<>(); - for ( Artifact cpArtifact : getProviderClasspath( providerArtifactId, providerVersion ) ) - { - String key = cpArtifact.getGroupId() + ":" + cpArtifact.getArtifactId(); - cpArtifactsMapping.put( key, cpArtifact ); - } - return cpArtifactsMapping; + return artifactMapByVersionlessId( getProviderClasspath( providerArtifactId, providerVersion ) ); } Set<Artifact> addProviderToClasspath( Map<String, Artifact> pluginArtifactMap, Artifact mojoPluginArtifact, diff --git a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/AbstractSurefireMojoTest.java b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/AbstractSurefireMojoTest.java index 9d2df22..78e135f 100644 --- a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/AbstractSurefireMojoTest.java +++ b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/AbstractSurefireMojoTest.java @@ -586,20 +586,20 @@ public class AbstractSurefireMojoTest public ArtifactResolutionResult answer( InvocationOnMock invocation ) { ArtifactResolutionRequest req = (ArtifactResolutionRequest) invocation.getArguments()[0]; - Artifact artifact = req.getArtifact(); - if ( artifact == surefireProvider ) + Artifact resolvable = req.getArtifact(); + if ( resolvable == surefireProvider ) { return surefireProviderResolutionResult; } - else if ( "org.junit.platform".equals( req.getArtifact().getGroupId() ) - && "junit-platform-engine".equals( req.getArtifact().getArtifactId() ) - && "1.4.0".equals( req.getArtifact().getVersion() ) ) + else if ( "org.junit.platform".equals( resolvable.getGroupId() ) + && "junit-platform-engine".equals( resolvable.getArtifactId() ) + && "1.4.0".equals( resolvable.getVersion() ) ) { return createVintageEngineResolutionResult(); } - else if ( "org.junit.platform".equals( req.getArtifact().getGroupId() ) - && "junit-platform-launcher".equals( req.getArtifact().getArtifactId() ) - && "1.4.0".equals( req.getArtifact().getVersion() ) ) + else if ( "org.junit.platform".equals( resolvable.getGroupId() ) + && "junit-platform-launcher".equals( resolvable.getArtifactId() ) + && "1.4.0".equals( resolvable.getVersion() ) ) { return createExpectedJUnitPlatformLauncherResolutionResult(); } @@ -734,7 +734,8 @@ public class AbstractSurefireMojoTest public ArtifactResolutionResult answer( InvocationOnMock invocation ) { ArtifactResolutionRequest req = (ArtifactResolutionRequest) invocation.getArguments()[0]; - if ( req.getArtifact() == surefireProvider ) + Artifact resolvable = req.getArtifact(); + if ( resolvable == surefireProvider ) { return createSurefireProviderResolutionResult( surefireVersion ); } @@ -760,17 +761,13 @@ public class AbstractSurefireMojoTest surefireVersion, null, "jar", null, mock( ArtifactHandler.class ) ); Artifact launcher = new DefaultArtifact( "org.junit.platform", "junit-platform-launcher", createFromVersion( "1.3.2" ), null, "jar", null, mock( ArtifactHandler.class ) ); - Artifact apiguardian = new DefaultArtifact( "org.apiguardian", "apiguardian-api", - createFromVersion( "1.0.0" ), null, "jar", null, mock( ArtifactHandler.class ) ); Artifact engine = new DefaultArtifact( "org.junit.platform", "junit-platform-engine", createFromVersion( "1.3.2" ), null, "jar", null, mock( ArtifactHandler.class ) ); - Artifact commons = new DefaultArtifact( "org.junit.platform", "junit-platform-commons", - createFromVersion( "1.3.2" ), null, "jar", null, mock( ArtifactHandler.class ) ); Artifact opentest4j = new DefaultArtifact( "org.opentest4j", "opentest4j", createFromVersion( "1.1.1" ), null, "jar", null, mock( ArtifactHandler.class ) ); assertThat( resolvedProviderArtifacts ) - .hasSize( 7 ) - .containsOnly( provider, java5, launcher, apiguardian, engine, commons, opentest4j ); + .hasSize( 5 ) + .containsOnly( provider, java5, launcher, engine, opentest4j ); assertThat( testClasspathWrapper.getTestDependencies() ) .hasSize( 3 ) @@ -845,18 +842,19 @@ public class AbstractSurefireMojoTest public ArtifactResolutionResult answer( InvocationOnMock invocation ) { ArtifactResolutionRequest req = (ArtifactResolutionRequest) invocation.getArguments()[0]; - if ( req.getArtifact() == surefireProvider ) + Artifact resolvable = req.getArtifact(); + if ( resolvable == surefireProvider ) { return createSurefireProviderResolutionResult( surefireVersion ); } - else if ( req.getArtifact().equals( testClasspathJUnit5 ) ) + else if ( resolvable.equals( testClasspathJUnit5 ) ) { return createResolutionResult( testClasspathJUnit5, testClasspathApiguardian, testClasspathCommons, testClasspathOpentest4j ); } - else if ( "org.junit.platform".equals( req.getArtifact().getGroupId() ) - && "junit-platform-launcher".equals( req.getArtifact().getArtifactId() ) - && "1.4.0".equals( req.getArtifact().getVersion() ) ) + else if ( "org.junit.platform".equals( resolvable.getGroupId() ) + && "junit-platform-launcher".equals( resolvable.getArtifactId() ) + && "1.4.0".equals( resolvable.getVersion() ) ) { return createExpectedJUnitPlatformLauncherResolutionResult(); } @@ -1107,9 +1105,9 @@ public class AbstractSurefireMojoTest { return createExpectedJUnitPlatformLauncherResolutionResult(); } - else if ( "org.junit.platform".equals( req.getArtifact().getGroupId() ) - && "junit-platform-engine".equals( req.getArtifact().getArtifactId() ) - && "1.4.0".equals( req.getArtifact().getVersion() ) ) + else if ( "org.junit.platform".equals( resolvable.getGroupId() ) + && "junit-platform-engine".equals( resolvable.getArtifactId() ) + && "1.4.0".equals( resolvable.getVersion() ) ) { return createVintageEngineResolutionResult(); } @@ -1148,6 +1146,164 @@ public class AbstractSurefireMojoTest entry( "org.opentest4j:opentest4j", testClasspathOpentest4j ) ); } + @Test + public void shouldSmartlyResolveJUnit5ProviderWithJupiterEngineInPluginDependencies() throws Exception + { + + final VersionRange surefireVersion = createFromVersion( "1" ); + + final Artifact plugin = new DefaultArtifact( "org.apache.maven.surefire", "maven-surefire-plugin", + surefireVersion, null, "jar", null, mock( ArtifactHandler.class ) ); + + final Artifact forkedBooter = new DefaultArtifact( "org.apache.maven.surefire", + "surefire-booter", surefireVersion, null, "jar", null, mock( ArtifactHandler.class ) ); + + Artifact pluginDepJupiterEngine = new DefaultArtifact( "org.junit.jupiter", "junit-jupiter-engine", + createFromVersion( "5.4.0" ), null, "jar", null, mock( ArtifactHandler.class ) ); + + Artifact pluginDepPlatformEngine = new DefaultArtifact( "org.junit.platform", "junit-platform-engine", + createFromVersion( "1.4.0" ), null, "jar", null, mock( ArtifactHandler.class ) ); + + Artifact pluginDepJupiterApi = new DefaultArtifact( "org.junit.jupiter", "junit-jupiter-api", + createFromVersion( "5.4.0" ), null, "jar", null, mock( ArtifactHandler.class ) ); + + Artifact pluginDepApiguardian = new DefaultArtifact( "org.apiguardian", "apiguardian-api", + createFromVersion( "1.0.0" ), null, "jar", null, mock( ArtifactHandler.class ) ); + + Artifact pluginDepCommons = new DefaultArtifact( "org.junit.platform", "junit-platform-commons", + createFromVersion( "1.4.0" ), null, "jar", null, mock( ArtifactHandler.class ) ); + + Artifact pluginDepOpentest4j = new DefaultArtifact( "org.opentest4j", "opentest4j", + createFromVersion( "1.1.1" ), null, "jar", null, mock( ArtifactHandler.class ) ); + + Map<String, Artifact> pluginDependencies = new HashMap<>(); + pluginDependencies.put( "org.apache.maven.surefire:maven-surefire-plugin", plugin ); + pluginDependencies.put( "org.apache.maven.surefire:surefire-booter", forkedBooter ); + pluginDependencies.put( "org.junit.jupiter:junit-jupiter-engine", pluginDepJupiterEngine ); + pluginDependencies.put( "org.junit.platform:junit-platform-engine", pluginDepPlatformEngine ); + pluginDependencies.put( "org.junit.jupiter:junit-jupiter-api", pluginDepJupiterApi ); + pluginDependencies.put( "org.apiguardian:apiguardian-api", pluginDepApiguardian ); + pluginDependencies.put( "org.junit.platform:junit-platform-commons", pluginDepCommons ); + pluginDependencies.put( "org.opentest4j:opentest4j", pluginDepOpentest4j ); + mojo.setPluginArtifactMap( pluginDependencies ); + + MavenProject mavenProject = new MavenProject(); + mavenProject.setArtifact( new DefaultArtifact( "dummy", "pom", createFromVersion( "1.0.0" ), + null, "jar", null, mock( ArtifactHandler.class ) ) ); + mojo.setProject( mavenProject ); + + Artifact junitPlatformArtifact = new DefaultArtifact( "g", "a", + createFromVersion( "0" ), null, "jar", null, mock( ArtifactHandler.class ) ); + + final Artifact testClasspathSomeTestArtifact = new DefaultArtifact( "third.party", "artifact", + createFromVersion( "1.0" ), null, "jar", null, mock( ArtifactHandler.class ) ); + + final Artifact testClasspathJupiterApi = new DefaultArtifact( "org.junit.jupiter", "junit-jupiter-api", + createFromVersion( "5.3.0" ), null, "jar", null, mock( ArtifactHandler.class ) ); + + final Artifact testClasspathApiguardian = new DefaultArtifact( "org.apiguardian", "apiguardian-api", + createFromVersion( "1.0.0" ), null, "jar", null, mock( ArtifactHandler.class ) ); + + final Artifact testClasspathCommons = new DefaultArtifact( "org.junit.platform", "junit-platform-commons", + createFromVersion( "1.4.0" ), null, "jar", null, mock( ArtifactHandler.class ) ); + + final Artifact testClasspathOpentest4j = new DefaultArtifact( "org.opentest4j", "opentest4j", + createFromVersion( "1.1.1" ), null, "jar", null, mock( ArtifactHandler.class ) ); + + Iterable<Artifact> testArtifacts = asList( testClasspathSomeTestArtifact, testClasspathJupiterApi, + testClasspathApiguardian, testClasspathCommons, testClasspathOpentest4j ); + + File classesDirectory = new File( "target/classes" ); + + File testClassesDirectory = new File( "target/test-classes" ); + + TestClassPath testClasspathWrapper = + new TestClassPath( testArtifacts, classesDirectory, testClassesDirectory, null ); + + mojo.setRemoteRepositories( Collections.<ArtifactRepository>emptyList() ); + mojo.setProjectRemoteRepositories( Collections.<ArtifactRepository>emptyList() ); + RepositorySystem repositorySystem = mock( RepositorySystem.class ); + final Artifact surefireProvider = new DefaultArtifact( "org.apache.maven.surefire", + "surefire-junit-platform", surefireVersion, null, "jar", null, mock( ArtifactHandler.class ) ); + when( repositorySystem.createDependencyArtifact( any( Dependency.class ) ) ).thenAnswer( new Answer<Artifact>() + { + @Override + public Artifact answer( InvocationOnMock invocation ) + { + Dependency provider = (Dependency) invocation.getArguments()[0]; + assertThat( provider.getGroupId() ).isEqualTo( "org.apache.maven.surefire" ); + assertThat( provider.getArtifactId() ).isEqualTo( "surefire-junit-platform" ); + return surefireProvider; + } + } ); + + when( repositorySystem.resolve( any( ArtifactResolutionRequest.class ) ) ) + .thenAnswer( new Answer<ArtifactResolutionResult>() + { + @Override + public ArtifactResolutionResult answer( InvocationOnMock invocation ) + { + ArtifactResolutionRequest req = (ArtifactResolutionRequest) invocation.getArguments()[0]; + Artifact resolvable = req.getArtifact(); + if ( resolvable == surefireProvider ) + { + return createSurefireProviderResolutionResult( surefireVersion ); + } + else if ( "org.junit.platform".equals( resolvable.getGroupId() ) + && "junit-platform-launcher".equals( resolvable.getArtifactId() ) + && "1.4.0".equals( resolvable.getVersion() ) ) + { + return createExpectedJUnitPlatformLauncherResolutionResult(); + } + else if ( "org.apache.maven.surefire".equals( resolvable.getGroupId() ) + && "maven-surefire-plugin".equals( resolvable.getArtifactId() ) + && "1".equals( resolvable.getVersion() ) ) + { + Set<Artifact> pluginItself = new HashSet<>(); + pluginItself.add( plugin ); + pluginItself.add( forkedBooter ); + ArtifactResolutionResult launcherResolutionResult = mock( ArtifactResolutionResult.class ); + when( launcherResolutionResult.getArtifacts() ) + .thenReturn( pluginItself ); + return launcherResolutionResult; + } + else + { + fail(); + return null; + } + } + } ); + + mojo.setRepositorySystem( repositorySystem ); + mojo.setLogger( mock( Logger.class ) ); + + invokeMethod( mojo, "setupStuff" ); + JUnitPlatformProviderInfo prov = + mojo.createJUnitPlatformProviderInfo( junitPlatformArtifact, testClasspathWrapper ); + Set<Artifact> resolvedProviderArtifacts = prov.getProviderClasspath(); + + Artifact java5 = new DefaultArtifact( "org.apache.maven.surefire", "common-java5", + surefireVersion, null, "jar", null, mock( ArtifactHandler.class ) ); + Artifact launcher = new DefaultArtifact( "org.junit.platform", "junit-platform-launcher", + createFromVersion( "1.4.0" ), null, "jar", null, mock( ArtifactHandler.class ) ); + Artifact jupiterEngine = new DefaultArtifact( "org.junit.jupiter", "junit-jupiter-engine", + createFromVersion( "5.4.0" ), null, "jar", null, mock( ArtifactHandler.class ) ); + Artifact platformEngine = new DefaultArtifact( "org.junit.platform", "junit-platform-engine", + createFromVersion( "1.4.0" ), null, "jar", null, mock( ArtifactHandler.class ) ); + assertThat( resolvedProviderArtifacts ) + .hasSize( 5 ) + .containsOnly( surefireProvider, java5, launcher, jupiterEngine, platformEngine ); + + assertThat( testClasspathWrapper.getTestDependencies() ) + .hasSize( 5 ) + .includes( entry( "third.party:artifact", testClasspathSomeTestArtifact ), + entry( "org.junit.jupiter:junit-jupiter-api", testClasspathJupiterApi ), + entry( "org.apiguardian:apiguardian-api", testClasspathApiguardian ), + entry( "org.junit.platform:junit-platform-commons", testClasspathCommons ), + entry( "org.opentest4j:opentest4j", testClasspathOpentest4j ) ); + } + private static ArtifactResolutionResult createJUnitPlatformLauncherResolutionResult( Artifact junit5Engine, Artifact apiguardian, Artifact commons, Artifact opentest4j ) { @@ -1271,10 +1427,10 @@ public class AbstractSurefireMojoTest public static class Mojo extends AbstractSurefireMojo { - private JUnitPlatformProviderInfo createJUnitPlatformProviderInfo( Artifact junitPlatformArtifact, + private JUnitPlatformProviderInfo createJUnitPlatformProviderInfo( Artifact providerArtifact, TestClassPath testClasspathWrapper ) { - return new JUnitPlatformProviderInfo( junitPlatformArtifact, testClasspathWrapper ); + return new JUnitPlatformProviderInfo( providerArtifact, testClasspathWrapper ); } @Override @@ -1646,7 +1802,8 @@ public class AbstractSurefireMojoTest @Override protected Artifact getMojoArtifact() { - return null; + return new DefaultArtifact( "org.apache.maven.surefire", "maven-surefire-plugin", createFromVersion( "1" ), + null, "jar", null, mock( ArtifactHandler.class ) ); } } diff --git a/maven-surefire-plugin/src/site/apt/examples/junit-platform.apt.vm b/maven-surefire-plugin/src/site/apt/examples/junit-platform.apt.vm index 497043c..1a11987 100644 --- a/maven-surefire-plugin/src/site/apt/examples/junit-platform.apt.vm +++ b/maven-surefire-plugin/src/site/apt/examples/junit-platform.apt.vm @@ -76,11 +76,10 @@ Using JUnit 5 Platform * Smart Resolution of Jupiter Engine and Vintage Engine for JUnit4 (since plugin version 3.0.0-M4) - Normally the developer does not want to access internal classes of JUnit5 engine (e.g. <<<5.4.0>>>). In this example - the POM has only Jupiter API dependency in test classpath. The engine artifact appears in plugin dependencies. + JUnit5 API artifact and your test sources become isolated from engine. - Since the version 3.0.0-M4 you can specify only JUnit5 API artifact and your test sources become isolated from engine. - The engine is resolved by the plugin and downloaded from a remote repository. + Normally the developer does not want to access internal classes of JUnit5 engine (e.g. <<<5.4.0>>>). In this example + the POM has only Jupiter API dependency in test classpath. +---+ <dependencies> @@ -96,7 +95,38 @@ Using JUnit 5 Platform ... <build> <plugins> - ... + [...] + <plugin> + <groupId>${project.groupId}</groupId> + <artifactId>${project.artifactId}</artifactId> + <version>${project.version}</version> + [... configuration or goals and executions ...] + </plugin> + [...] + </plugins> +</build> +... ++---+ + + In the following example the engine artifact appears in plugin dependencies and the engine is resolved by the plugin + and downloaded from a remote repository for plugins. You may want to update the version of engine with fixed bugs in + <<<5.3.2>>> but the API version <<<5.3.0>>> stays intact! + ++---+ +<dependencies> + [...] + <dependency> + <groupId>org.junit.jupiter</groupId> + <artifactId>junit-jupiter-api</artifactId> + <version>5.3.0</version> + <scope>test</scope> + </dependency> + [...] +</dependencies> +... +<build> + <plugins> + [...] <plugin> <groupId>${project.groupId}</groupId> <artifactId>${project.artifactId}</artifactId> @@ -105,11 +135,11 @@ Using JUnit 5 Platform <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> - <version>5.4.0</version> - <scope>test</scope> + <version>5.3.2</version> </dependency> </dependencies> </plugin> + [...] </plugins> </build> ... @@ -142,7 +172,6 @@ Using JUnit 5 Platform <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> <version>5.4.0</version> - <scope>test</scope> </dependency> </dependencies> </plugin>