Shrinkwrap add maven dependency for Arquillian and WildFly

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>

Leave a Reply

Your email address will not be published. Required fields are marked *

question razz sad evil exclaim smile redface biggrin surprised eek confused cool lol mad twisted rolleyes wink idea arrow neutral cry mrgreen

*