26

How do you add all dependencies in the POM to arquillian?

Maven.resolver().loadPomFromFile("pom.xml").importRuntimeDependencies() .as(File.class); 

I found that line, but I Maven is red in intellij because it doesn't find the class. I don't know which dependencies I need. Or are there better ways?

5
  • What are you trying to achieve ? Commented Oct 21, 2012 at 19:27
  • All the dependencies that my code have (ToStringBuilder, EqualsBuilder...). I already said that I need all the dependencies in the POM. Commented Oct 21, 2012 at 19:32
  • How does that answer my question? Commented Oct 21, 2012 at 19:38
  • It doesn't. If your code has some dependencies, then it should get them from somewhere, right ? The two classes that you've mentioned come from commons-lang. I don't know what arquillian has to do here. Commented Oct 21, 2012 at 19:44
  • 15
    Please, just stop when you can't answer. Commented Oct 21, 2012 at 19:49

4 Answers 4

36

Adding Arquillian dependencies

Add Arquillian dependencies to your pom.xml:

<dependencyManagement> <dependencies> <dependency> <groupId>org.jboss.arquillian</groupId> <artifactId>arquillian-bom</artifactId> <version>1.1.8.Final</version> <scope>import</scope> <type>pom</type> </dependency> </dependencies> </dependencyManagement> 

Add the ShrinkWrap resolver (Maven implementation) to your pom.xml:

<dependency> <groupId>org.jboss.shrinkwrap.resolver</groupId> <artifactId>shrinkwrap-resolver-impl-maven</artifactId> <scope>test</scope> </dependency> 

If you are using JUnit, add the Arquillian JUnit container to your pom.xml:

<dependency> <groupId>org.jboss.arquillian.junit</groupId> <artifactId>arquillian-junit-container</artifactId> <scope>test</scope> </dependency> 

Importing Maven dependencies

In your test class, within the method annotated with @Deployment, import the runtime dependencies with the following line:

File[] files = Maven.resolver().loadPomFromFile("pom.xml") .importRuntimeDependencies().resolve().withTransitivity().asFile(); 

And add the dependencies to your deploy using the method addAsLibraries(files):

WebArchive war = ShrinkWrap.create(WebArchive.class) .addClass(MyClass1.class) .addClass(MyClass2.class) .addClass(MyClass3.class) .addAsLibraries(files); 

This is how your test class will look like if you are using JUnit

import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.junit.Arquillian; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.asset.EmptyAsset; import org.jboss.shrinkwrap.api.spec.WebArchive; import org.jboss.shrinkwrap.resolver.api.maven.Maven; import org.junit.Test; import org.junit.runner.RunWith; import static org.junit.Assert.*; import java.io.File; @RunWith(Arquillian.class) public class MyTestClassWithMavenDependencies { @Deployment public static WebArchive createDeployment() { // Import Maven runtime dependencies File[] files = Maven.resolver() .loadPomFromFile("pom.xml") .importRuntimeDependencies() .resolve() .withTransitivity() .asFile(); // Create deploy file WebArchive war = ShrinkWrap.create(WebArchive.class) .addClass(MyClass1.class) .addClass(MyClass2.class) .addClass(MyClass3.class) .addAsLibraries(files); // Show the deploy structure System.out.println(war.toString(true)); return war; } // Create your tests here } 

Note 1: The above solution has been tested with Arquillian 1.1.8.Final. Check the most recent version of Arquillian artifacts on the documentation.

Note 2: For more details on how to resolve dependencies, have a look at the ShrinkWrap Resolvers documentation.

Sign up to request clarification or add additional context in comments.

Comments

10

I had the same error as you. It's because of incorrect shrinkwrap versions. See correct versions in the second piece of code.

package alehro.testgf2; import java.io.File; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.junit.Arquillian; import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.spec.WebArchive; import org.jboss.shrinkwrap.resolver.api.maven.Maven; import org.joda.time.DateTime; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import alehro.p1.C1; import alehro.p1.C2; @RunWith(Arquillian.class) public class Test1 { @Deployment public static Archive<?> createTestArchive() { File[] libs = Maven.resolver().loadPomFromFile("pom.xml").importRuntimeAndTestDependencies().asFile(); WebArchive res = ShrinkWrap.create(WebArchive.class, "test.war"); for(File file : libs){ res.addAsLibrary(file); } res.addPackages(true, "alehro.p1"); return res; } @Test public void test1(){ //third party lib DateTimeFormatter inputDF = DateTimeFormat.forPattern("d MMM yyyy HH:mm:ss Z"); DateTime dt1 = inputDF.parseDateTime("28 Nov 2012 23:23:23 +04"); Assert.assertNotNull(dt1); //all classes from alehro.p1 Assert.assertEquals("Failure", "I'm C1", C1.getMyName()) ; Assert.assertEquals("Failure", "I'm C2", C2.getMyName()) ; } } 

I had a harsh time resolving maven dependencies. Below is working solution, but I'm sure it can be simplified more.

<dependencies> <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.1</version> </dependency> <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>6.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.jboss.arquillian.junit</groupId> <artifactId>arquillian-junit-container</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.jboss.arquillian.container</groupId> <artifactId>arquillian-glassfish-remote-3.1</artifactId> <scope>test</scope> <version>1.0.0.CR3</version> </dependency> <dependency> <groupId>org.jboss.shrinkwrap.resolver</groupId> <artifactId>shrinkwrap-resolver-api</artifactId> <version>2.0.0-alpha-5</version> <scope>test</scope> </dependency> <dependency> <groupId>org.jboss.shrinkwrap.resolver</groupId> <artifactId>shrinkwrap-resolver-impl-maven</artifactId> <version>2.0.0-alpha-5</version> <scope>test</scope> </dependency> <dependency> <groupId>org.jboss.shrinkwrap.resolver</groupId> <artifactId>shrinkwrap-resolver-api-maven</artifactId> <version>2.0.0-alpha-5</version> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.jboss.shrinkwrap.resolver</groupId> <artifactId>shrinkwrap-resolver-bom</artifactId> <version>2.0.0-alpha-5</version> <scope>import</scope> <type>pom</type> </dependency> <dependency> <groupId>org.jboss.arquillian</groupId> <artifactId>arquillian-bom</artifactId> <version>1.0.3.Final</version> <scope>import</scope> <type>pom</type> </dependency> </dependencies> </dependencyManagement> 

Original idea is from here: How to I add Maven artifacts to my ShrinkWrap archives?

Comments

6

This dzone article Using the ShrinkWrap Maven Resolver for Arquillian Tests which might be useful. It suggests:

<dependency> <groupId>org.jboss.shrinkwrap.resolver</groupId> <artifactId>shrinkwrap-resolver-impl-maven</artifactId> </dependency> 

Another way you can find a class when you don't know which artifact it's in is to use search.maven.org. Here's a search for the class you are looking for:

It shows the artifacts containing that class. However, the class is in an API jar, and you'll also want the implementation jar as mentioned above and in the aformentioned article.

Comments

0

The org.jboss.shrinkwrap.resolver.api.maven.Maven class is included by shrinkwrap-resolver-impl-maven 2.0.0-beta-1 or later.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.