When building deployable for Arquillian with Shrinkwrap, it is very useful to be able to add your maven dependencies. Fortunately this is possible using
PomEquippedResolveStage pom = Maven.resolver().loadPomFromFile(pathPrefix + "pom.xml"); File[] commonsLang = pom.resolve("org.apache.commons:commons-lang3").withTransitivity().asFile(); WebArchive war = ShrinkWrap.create(WebArchive.class, "test.war"); war.addAsLibraries(commonsLang); |
This requires the following dependency
<dependencyManagement> <dependencies> <dependency> <groupId>org.jboss.arquillian</groupId> <artifactId>arquillian-bom</artifactId> <version>1.1.2.Final</version> <scope>import</scope> <type>pom</type> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.jboss.shrinkwrap.resolver</groupId> <artifactId>shrinkwrap-resolver-impl-maven</artifactId> <scope>test</scope> </dependency> </dependencies> |
Unfortunately, this does not work when you use the WildFly bom. You then get an error like
java.lang.RuntimeException: Could not invoke deployment method: public static org.jboss.shrinkwrap.api.Archive be.fluxtock.back.impl.AbstractIT.createDeployment() throws java.lang.Exception at org.jboss.arquillian.container.test.impl.client.deployment.AnnotationDeploymentScenarioGenerator.invoke(AnnotationDeploymentScenarioGenerator.java:177) Caused by: java.lang.reflect.InvocationTargetException: null at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) Caused by: java.lang.RuntimeException: Could not create object from user view at org.jboss.shrinkwrap.resolver.api.ResolverSystemFactory.createFromUserView(ResolverSystemFactory.java:95) Caused by: java.lang.reflect.InvocationTargetException: null at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) Caused by: java.lang.RuntimeException: Could not create new service instance at org.jboss.shrinkwrap.resolver.spi.loader.SpiServiceLoader.createInstance(SpiServiceLoader.java:240) Caused by: java.lang.reflect.InvocationTargetException: null at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) Caused by: java.lang.NoClassDefFoundError: org/apache/maven/repository/internal/MavenRepositorySystemSession at org.jboss.shrinkwrap.resolver.impl.maven.bootstrap.MavenRepositorySystem.getSession(MavenRepositorySystem.java:84) Caused by: java.lang.ClassNotFoundException: org.apache.maven.repository.internal.MavenRepositorySystemSession at java.net.URLClassLoader$1.run(URLClassLoader.java:359) |
If you use the enforer plugin with the requireUpperBoundDeps test, you will see exceptions pointing in the right direction.
Failed while enforcing RequireUpperBoundDeps. The error(s) are [ Require upper bound dependencies error for org.apache.maven:maven-model:3.0.5 paths to dependency are: +-be.fluxtock:fluxtock-back-impl:1.0-SNAPSHOT +-org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-impl-maven:2.0.0 +-org.apache.maven:maven-model:3.0.5 and +-be.fluxtock:fluxtock-back-impl:1.0-SNAPSHOT +-org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-impl-maven:2.0.0 +-org.apache.maven:maven-aether-provider:3.1.1 +-org.apache.maven:maven-model:3.1.1 and +-be.fluxtock:fluxtock-back-impl:1.0-SNAPSHOT +-org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-impl-maven:2.0.0 +-org.apache.maven:maven-model-builder:3.0.5 +-org.apache.maven:maven-model:3.0.5 , Require upper bound dependencies error for org.apache.maven:maven-model-builder:3.0.5 paths to dependency are: +-be.fluxtock:fluxtock-back-impl:1.0-SNAPSHOT +-org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-impl-maven:2.0.0 +-org.apache.maven:maven-model-builder:3.0.5 and +-be.fluxtock:fluxtock-back-impl:1.0-SNAPSHOT +-org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-impl-maven:2.0.0 +-org.apache.maven:maven-aether-provider:3.1.1 +-org.apache.maven:maven-model-builder:3.1.1 , Require upper bound dependencies error for org.apache.maven:maven-repository-metadata:3.0.5 paths to dependency are: +-be.fluxtock:fluxtock-back-impl:1.0-SNAPSHOT +-org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-impl-maven:2.0.0 +-org.apache.maven:maven-repository-metadata:3.0.5 and +-be.fluxtock:fluxtock-back-impl:1.0-SNAPSHOT +-org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-impl-maven:2.0.0 +-org.apache.maven:maven-aether-provider:3.1.1 +-org.apache.maven:maven-repository-metadata:3.1.1 ] |
It seems some settings in the WildFly and the Arquillian boms interfere, causing an invalid set of dependencies being included by maven.
To solve this, include the following section in your dependencyManagement section:
<dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-aether-provider</artifactId> <version>3.0.5</version> </dependency> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-model</artifactId> <version>3.0.5</version> </dependency> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-model-builder</artifactId> <version>3.0.5</version> </dependency> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-repository-metadata</artifactId> <version>3.0.5</version> </dependency> |