2012-12-06 8 views
6

Sto utilizzando Arquillian [1] per testare la mia app J2EE in un ambiente di glassfish incorporato all'interno di Eclipse [2] -IDE.Arquillian: l'aggiunta di beans.xml causa "ArquillianServletRunner non trovato"

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); 
    } 
} 

Il test viene eseguito bene fino a quando aggiungo l'istruzione ha mostrato ".addAsWebInfResource (...)". Nel fare questo, in seguito viene generata un'eccezione:

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) 

Senza beans.xml, naturalmente, CDI non funziona.

Come evitare questa eccezione?

ho caricato il mio pom.xml a http://pastxt.com/P/7IT1VYWBUW

Ambiente: jdk1.7.0_02/Win7/Eclipse Juno SR1

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

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

+0

Avete un test case riproducibile su cui potrei lavorare?Mentre il tuo test è simile a [questo particolare nell'adattatore GF] (https://github.com/arquillian/arquillian-container-glassfish/blob/master/glassfish-embedded-3.1/src/test/java/org/ jboss/arquillian/container/glassfish/embedded_3_1/app/IntegrationWarTestCase.java), non riesco a riprodurre l'errore che vedi. –

+0

Ho aggiornato la domanda - il test è ridotto al minimo senza dipendenze ora, il mio pom.xml è disponibile online; esiste un errore al mio fianco in questo ambiente. –

+0

Ho visto questo errore più volte su diversi progetti e il più delle volte è stato causato dall'impostazione jar/war/ear nel metodo annotato sulla distribuzione di @. Controlla tutte le dipendenze e tutte le classi necessarie per il test. Soprattutto se si utilizza EJB, eseguire il drill down nelle dipendenze di secondo o terzo livello utilizzate come riferimento EJB @. –

risposta

5

I ho dato un'occhiata al tuo POM e al tuo test. Il problema sembra essere correlato a GLASSFISH-16964, passando per le seguenti voci di registro:

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 

avete un paio di dipendenze nel progetto che tirano in v1.6.1 di slf4j-api. Ciò sembra essere in conflitto con ciò che richiede GlassFish: credo che sia 1.5.10 che passa dai log di GlassFish incorporato.

Per risolvere questo particolare problema, eseguire il downgrade alla versione che rende felice GlassFish. Ho aggiunto la versione inferiore come dipendenza gestita.

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

Naturalmente, questo potrebbe avere un impatto sulle altre librerie che dipendono dalla versione più recente di slf4-api, quindi dovrete guardare fuori per altre questioni.

Il modo migliore per risolvere questo problema è utilizzare l'adattatore Arquillian GlassFish remoto o gestito.

+0

[INFO] BUILD SUCCESSFUL Grazie! Dipendenza –

+1

: l'albero è tuo amico! – cwash

+0

ho lo stesso problema e ho provato la stessa soluzione di cui sopra, ma ho lo stesso problema se ho lasciato 'JavaArchive jar = ShrinkWrap.create (JavaArchive.class)' o 'JavaArchive jar = ShrinkWrap.create (JavaArchive.class, "test.jar") ' Ma quando faccio così:' JavaArchive jar = ShrinkWrap.create (JavaArchive.class, "test") 'funziona bene ma quando provo a iniettare qualsiasi bean o ejb non lo fa lavoro. Qualche idea? – TinyOS

-1

Ho avuto lo stesso problema con Glassfish embedded 3.1.2. Ma sembra essere risolto in 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> 
0

Aggiunta del sottostante per il web.xml ha fatto il trucco per me:

<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> 
0

ArquillianServletRunner not found. Could not determine ContextRoot from ProtocolMetadata, please contact DeployableContainer developer. sembra indicare che si è verificato un errore durante la distribuzione. Il messaggio - puoi pensare ed esprimere ciò che vuoi - non ha niente a che fare con quell'errore (fonte: https://developer.jboss.org/thread/173340)! È necessario accedere ai registri per capire cosa non va che è presente nella console o in una posizione configurata in un file specificato nella proprietà di sistema java.util.logging.config.file, ad es. aggiungere

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 

Nel mio caso mancava com.google.guava:guava:23.0:test e il problema è stato correlato ad aggiungere beans.xml come Asset.EMPTY di Shrinkwrap.

Problemi correlati