Добавление всех зависимостей Maven к Arquillian
Как вы добавляете все зависимости в POM к arquillian?
Maven.resolver().loadPomFromFile("pom.xml").importRuntimeDependencies()
.as(File.class);
Я нашел эту строку, но я Maven
является красным в intellij, потому что он не находит класс. Я не знаю, какие зависимости мне нужны. Или есть лучшие способы?
Ответы
Ответ 1
Добавление аркильских зависимостей
Добавьте аркильские зависимости к вашему 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>
Добавьте преобразование ShrinkWrap (реализация Maven) к вашему pom.xml
:
<dependency>
<groupId>org.jboss.shrinkwrap.resolver</groupId>
<artifactId>shrinkwrap-resolver-impl-maven</artifactId>
<scope>test</scope>
</dependency>
Если вы используете JUnit, добавьте контейнер Arquillian JUnit в свой pom.xml
:
<dependency>
<groupId>org.jboss.arquillian.junit</groupId>
<artifactId>arquillian-junit-container</artifactId>
<scope>test</scope>
</dependency>
Импорт зависимостей Maven
В вашем тестовом классе в рамках метода, аннотированного с помощью @Deployment
, импортируйте зависимости времени выполнения со следующей строкой:
File[] files = Maven.resolver().loadPomFromFile("pom.xml")
.importRuntimeDependencies().resolve().withTransitivity().asFile();
И добавьте зависимости для развертывания с помощью метода addAsLibraries(files)
:
WebArchive war = ShrinkWrap.create(WebArchive.class)
.addClass(MyClass1.class)
.addClass(MyClass2.class)
.addClass(MyClass3.class)
.addAsLibraries(files);
Так будет выглядеть ваш тестовый класс, если вы используете 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
}
Примечание 1: Вышеупомянутое решение было протестировано с помощью Arquillian 1.1.8.Final
. Проверьте последнюю версию аркиллианских артефактов в документации.
Примечание 2: Подробнее о том, как разрешать зависимости, см. Документация по разрешению ShrinkWrap Resolvers.суб >
Ответ 2
У меня была такая же ошибка, как и вы. Это из-за неправильной версии термоусадочной бумаги. См. Правильные версии во втором фрагменте кода.
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()) ;
}
}
У меня было жесткое время, разрешающее зависимости maven. Ниже приведено рабочее решение, но я уверен, что его можно будет упростить.
<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>
Оригинальная идея отсюда: Как добавить артефакты Maven в мои архивы ShrinkWrap?
Ответ 3
Эта статья dzone Использование ShrinkWrap Maven Resolver для аркиллианских тестов, которая может быть полезна. Это предполагает:
<dependency>
<groupId>org.jboss.shrinkwrap.resolver</groupId>
<artifactId>shrinkwrap-resolver-impl-maven</artifactId>
</dependency>
Другой способ найти класс, когда вы не знаете, какой артефакт он должен использовать search.maven.org. Здесь поиск нужного вам класса:
Здесь показаны артефакты, содержащие этот класс. Тем не менее, класс находится в банке API, и вам также понадобится реализация jar, как указано выше, и в вышеупомянутой статье.
Ответ 4
Класс org.jboss.shrinkwrap.resolver.api.maven.Maven включен с помощью shrinkwrap-resolver-impl-maven 2.0.0-beta-1 или новее.