【问题标题】:Arquillian: Adding beans.xml causes "ArquillianServletRunner not found"Arquillian:添加 beans.xml 会导致“未找到 ArquillianServletRunner”
【发布时间】:2012-12-06 18:20:22
【问题描述】:

我正在使用 Arquillian[1] 在 Eclipse[2]-IDE 内的嵌入式 glassfish 环境中测试我的 J2EE-App。

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/

【问题讨论】:

  • 你有我可以处理的可重现的测试用例吗?虽然您的测试看起来类似于 this particular one in the GF adapter,但我无法重现您看到的失败。
  • 我已经更新了这个问题——testclass 现在最小化了,没有依赖关系,我的 pom.xml 可以在线获取;在这种环境中,我这边存在错误。
  • 我在不同的项目中多次看到这个错误,大部分时间是由@Deployment注解方法中的jar/war/ear设置引起的。检查测试所需的所有依赖项和所有类。特别是如果您使用 EJB,请深入了解用作 @EJB 引用的第二或第三级依赖项。

标签: glassfish integration-testing jboss-arquillian


【解决方案1】:

我查看了您的 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

您的项目中有一些依赖项引入了 slf4j-api 的 v1.6.1。这似乎与嵌入式 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 适配器。

【讨论】:

  • [INFO] 构建成功谢谢!
  • 依赖:树是你的朋友!
  • 我有同样的问题,我尝试了上面给出的相同解决方案,但如果我让JavaArchive jar = ShrinkWrap.create(JavaArchive.class)JavaArchive jar = ShrinkWrap.create(JavaArchive.class,"test.jar") 我有同样的问题但是当我这样做时:JavaArchive jar = ShrinkWrap.create(JavaArchive.class,"test") 效果很好但是当我尝试注入任何 bean 或 ejb 时它不起作用。有什么想法吗?
  • 我也有同样的问题。降级 slf4j 库似乎并不能解决问题。
【解决方案2】:

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 添加为 Shrinkwrap 的 Asset.EMPTY 无关。

【讨论】:

    【解决方案3】:

    将以下内容添加到 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>
    

    【讨论】:

      【解决方案4】:

      我在 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>
      

      【讨论】:

        猜你喜欢
        • 2021-02-20
        • 1970-01-01
        • 2014-10-18
        • 1970-01-01
        • 1970-01-01
        • 2021-05-16
        • 2013-05-03
        • 2018-09-15
        相关资源
        最近更新 更多