Arquillian: добавление beans.xml приводит к тому, что ArquillianServletRunner не найден

Я использую Arquillian[1] для тестирования своего J2EE-приложения во встроенной среде Glassfish внутри Eclipse[2]-IDE.

package test.java;

import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.shrinkwrap.api.ArchivePaths;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.EmptyAsset;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(Arquillian.class)
public class ArquillianTest {

    @Deployment
    public static WebArchive createDeployment() {
        return ShrinkWrap.create(WebArchive.class).addAsWebInfResource(EmptyAsset.INSTANCE,
            ArchivePaths.create("beans.xml"));
    }

    @Test
    public void test() {
        Assert.assertNull(null);
    }
}

Тест выполняется нормально, пока я не добавлю показанную инструкцию ".addAsWebInfResource(...)". При этом возникает следующее исключение:

java.lang.IllegalArgumentException: ArquillianServletRunner not found. Could not determine ContextRoot from ProtocolMetadata, please contact DeployableContainer developer.
at org.jboss.arquillian.protocol.servlet.ServletUtil.determineBaseURI(ServletUtil.java:64)
at org.jboss.arquillian.protocol.servlet.ServletURIHandler.locateTestServlet(ServletURIHandler.java:60)
at org.jboss.arquillian.protocol.servlet.ServletMethodExecutor.invoke(ServletMethodExecutor.java:77)
at org.jboss.arquillian.container.test.impl.execution.RemoteTestExecuter.execute(RemoteTestExecuter.java:120)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:94)
at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:99)
at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:81)
at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:135)
at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:115)
at org.jboss.arquillian.core.impl.EventImpl.fire(EventImpl.java:67)
at org.jboss.arquillian.container.test.impl.execution.ClientTestExecuter.execute(ClientTestExecuter.java:57)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:94)
at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:99)
at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:81)
at org.jboss.arquillian.container.test.impl.client.ContainerEventController.createContext(ContainerEventController.java:142)
at org.jboss.arquillian.container.test.impl.client.ContainerEventController.createTestContext(ContainerEventController.java:129)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:94)
at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:88)
at org.jboss.arquillian.test.impl.TestContextHandler.createTestContext(TestContextHandler.java:89)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:94)
at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:88)
at org.jboss.arquillian.test.impl.TestContextHandler.createClassContext(TestContextHandler.java:75)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:94)
at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:88)
at org.jboss.arquillian.test.impl.TestContextHandler.createSuiteContext(TestContextHandler.java:60)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:94)
at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:88)
at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:135)
at org.jboss.arquillian.test.impl.EventTestRunnerAdaptor.test(EventTestRunnerAdaptor.java:111)
at org.jboss.arquillian.junit.Arquillian$6.evaluate(Arquillian.java:263)
at org.jboss.arquillian.junit.Arquillian$4.evaluate(Arquillian.java:226)
at org.jboss.arquillian.junit.Arquillian.multiExecute(Arquillian.java:314)
at org.jboss.arquillian.junit.Arquillian.access$100(Arquillian.java:46)
at org.jboss.arquillian.junit.Arquillian$5.evaluate(Arquillian.java:240)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.jboss.arquillian.junit.Arquillian$2.evaluate(Arquillian.java:185)
at org.jboss.arquillian.junit.Arquillian.multiExecute(Arquillian.java:314)
at org.jboss.arquillian.junit.Arquillian.access$100(Arquillian.java:46)
at org.jboss.arquillian.junit.Arquillian$3.evaluate(Arquillian.java:199)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at org.jboss.arquillian.junit.Arquillian.run(Arquillian.java:147)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

Без beans.xml, конечно, CDI не работает.

Как я могу избежать этого исключения?

Я загрузил файл pom.xml на http://pastxt.com/P/7IT1VYWBUW.

Среда: jdk1.7.0_02/Win7/Eclipse Juno SR1

[1] https://www.jboss.org/arquillian.html

[2] http://www.eclipse.org/


person Markus Schulte    schedule 06.12.2012    source источник
comment
У вас есть воспроизводимый тестовый пример, над которым я мог бы работать? Хотя ваш тест похож на этого конкретного в адаптере GF, я не могу воспроизвести ошибку, которую вы видите.   -  person Vineet Reynolds    schedule 07.12.2012
comment
Я обновил вопрос - теперь тестовый класс свернут без зависимостей, мой pom.xml доступен в Интернете; ошибка существует на моей стороне в этой среде.   -  person Markus Schulte    schedule 07.12.2012
comment
Я видел эту ошибку несколько раз в разных проектах, и в большинстве случаев она была вызвана настройкой jar/war/ear в аннотированном методе @Deployment. Проверьте все зависимости и все классы, необходимые для теста. Особенно, если вы используете EJB, разверните зависимости второго или третьего уровня, которые используются в качестве ссылки на @EJB.   -  person Frank Szilinski    schedule 12.08.2015


Ответы (4)


Я взглянул на ваш POM и ваш тест. Похоже, что проблема связана с GLASSFISH-16964, судя по следующим записям в журнале:

SLF4J: The requested version 1.5.10 by your slf4j binding is not compatible with [1.6]
SLF4J: See http://www.slf4j.org/codes.html#version_mismatch for further details.
Dec 07, 2012 2:09:59 PM org.glassfish.api.ActionReport failure
SEVERE: Exception while loading the app
Dec 07, 2012 2:09:59 PM org.glassfish.deployment.admin.DeployCommand execute
SEVERE: Exception while loading the app : org.slf4j.spi.LocationAwareLogger.log(Lorg/slf4j/Marker;Ljava/lang/String;ILjava/lang/String;Ljava/lang/Throwable;)V

У вас есть несколько зависимостей в вашем проекте, которые используют v1.6.1 из slf4j-api. Похоже, это противоречит тому, что требует встроенный GlassFish - я полагаю, что это 1.5.10 идет по журналам встроенного GlassFish.

Чтобы решить эту конкретную проблему, перейдите на версию, которая поддерживает GlassFish. Я добавил более низкую версию в качестве управляемой зависимости.

<dependencyManagement>
    <dependencies>
      ....
      <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-api</artifactId>
          <version>1.5.10</version>
          <scope>test</scope>
      </dependency>
    </dependencies>
</dependencies>

Конечно, это может повлиять на другие библиотеки, которые зависят от более новой версии slf4-api, поэтому вам придется следить за другими проблемами.

Лучший способ решить эту проблему — использовать удаленный или управляемый адаптер GlassFish Arquillian.

person Vineet Reynolds    schedule 07.12.2012
comment
[INFO] УСПЕШНАЯ СБОРКА Спасибо! - person Markus Schulte; 07.12.2012
comment
зависимость:дерево твой друг! - person cwash; 29.01.2013
comment
У меня та же проблема, и я пробовал то же решение, что и выше, но у меня та же проблема, если я разрешаю JavaArchive jar = ShrinkWrap.create(JavaArchive.class) или JavaArchive jar = ShrinkWrap.create(JavaArchive.class,"test.jar") Но когда я делаю так: JavaArchive jar = ShrinkWrap.create(JavaArchive.class,"test"), это работает хорошо, но когда я пытаюсь внедрить любой bean-компонент или ejb, это не так. Работа. Есть идеи? - person TinyOS; 30.04.2015
comment
У меня такая же проблема. Понижение библиотеки slf4j, похоже, не решает проблему. - person javadev; 21.04.2016

ArquillianServletRunner not found. Could not determine ContextRoot from ProtocolMetadata, please contact DeployableContainer developer. указывает на то, что во время развертывания произошла ошибка. Сообщение — вы можете думать и выражать то, что хотите — не имеет ничего общего с этой ошибкой (источник: https://developer.jboss.org/thread/173340)! Вам необходимо получить доступ к журналам, чтобы выяснить, что не так, которые находятся либо на консоли, либо в месте, которое настроено в файле, указанном в системном свойстве java.util.logging.config.file, например. добавлять

handlers=java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format=%4$s: %5$s%n
java.util.logging.ConsoleHandler.level=FINEST

В моем случае отсутствовал com.google.guava:guava:23.0:test, и проблема не была связана с добавлением beans.xml как Asset.EMPTY в термоусадочную пленку.

person Karl Richter    schedule 07.10.2017

У меня была такая же проблема со встроенным Glassfish 3.1.2. Но вроде пофиксили в 3.1.2.2.

<dependency>
    <groupId>org.glassfish.main.extras</groupId>
    <artifactId>glassfish-embedded-all</artifactId>
    <version>3.1.2.2</version>
    <scope>provided</scope>
</dependency>
person insideout    schedule 24.01.2014

Добавление ниже в web.xml помогло мне:

<servlet>
    <servlet-name>ArquillianServletRunner</servlet-name>
    <servlet-class>org.jboss.arquillian.protocol.servlet.runner.ServletTestRunner</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ArquillianServletRunner</servlet-name>
    <url-pattern>/ArquillianServletRunner</url-pattern>
</servlet-mapping>
person Lunga Zonke    schedule 12.07.2016