problem with JNDI and embedded JBoss 6 in Maven
stevemaring Mar 31, 2011 4:30 PMI seem to have a "damned if I do" and "damned if I don't" sort of problem with setting a jndi.properties file.
If I don't set a jndi.properties file, then my app server seems to start up just fine:
16:18:38,392 INFO [org.jboss.bootstrap.impl.base.server.AbstractServer] JBossAS [6.0.0.Final "Neo"] Started in 25s:969ms
but my unit test fails with:
<error message="Could not start container" type="org.jboss.arquillian.spi.client.container.LifecycleException">org.jboss.arquillian.spi.client.container.LifecycleException: Could not start container
at org.jboss.arquillian.container.jbossas.embedded_6.JBossASEmbeddedContainer.start(JBossASEmbeddedContainer.java:102)
...
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:69)
Caused by: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:325)
at javax.naming.InitialContext.lookup(InitialContext.java:392)
at org.jboss.arquillian.container.jbossas.embedded_6.JBossASEmbeddedContainer.initDeploymentManager(JBossASEmbeddedContainer.java:178)
at org.jboss.arquillian.container.jbossas.embedded_6.JBossASEmbeddedContainer.start(JBossASEmbeddedContainer.java:98)
... 76 more
</error>
If I do throw a jndi.properties file into the classpath of my unit test with:
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=jnp://localhost:1099
then the app server does not even start up and fails with:
ERROR [DefaultJndiBinder] Unable to create JNDI subcontext for Bean Validation Factories: javax.naming.CommunicationException: Could not obtain connection to any of these urls: localhost:1099 and discovery failed with error: javax.naming.CommunicationException: Receive timed out [Root exception is java.net.SocketTimeoutException: Receive timed out]
my pom file looks like this:
<properties>
<arquillian.version>1.0.0.Alpha5</arquillian.version>
<jbossas.version>6.0.0.Final</jbossas.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ejb-plugin</artifactId>
<version>2.3</version>
<configuration>
<ejbVersion>3.1</ejbVersion>
<generateClient>true</generateClient>
</configuration>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>integration-test</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.8</version>
<configuration>
<systemProperties>
<property>
<name>log4j.configuration</name>
<value>test-log4j.xml</value>
</property>
</systemProperties>
<additionalClasspathElements>
<additionalClasspathElement>${project.build.directory}/jboss-${jbossas.version}/client/jbossws-native-client.jar</additionalClasspathElement>
<additionalClasspathElement>${project.build.directory}/jboss-${jbossas.version}/server/default/deploy/jbossweb.sar</additionalClasspathElement>
</additionalClasspathElements>
<trimStackTrace>false</trimStackTrace>
<forkMode>once</forkMode>
<argLine>
-Xmx512m
-XX:MaxPermSize=256m
-Djava.net.preferIPv4Stack=true
-Djava.util.logging.manager=org.jboss.logmanager.LogManager
-Djava.endorsed.dirs=${project.build.directory}/jboss-${jbossas.version}/lib/endorsed
-Djboss.home=${project.build.directory}/jboss-${jbossas.version}
-Djboss.boot.server.log.dir=${project.build.directory}/jboss-${jbossas.version}
</argLine>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<id>unpack</id>
<phase>process-test-classes</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>org.jboss.jbossas</groupId>
<artifactId>jboss-as-distribution</artifactId>
<version>${jbossas.version}</version>
<type>zip</type>
<overWrite>false</overWrite>
<outputDirectory>${project.build.directory}</outputDirectory>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<dependencies>
<dependency>
<groupId>org.jboss.arquillian</groupId>
<artifactId>arquillian-junit</artifactId>
<version>${arquillian.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jboss.arquillian.container</groupId>
<artifactId>arquillian-jbossas-embedded-6</artifactId>
<version>${arquillian.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jboss.jbossas</groupId>
<artifactId>jboss-as-depchain</artifactId>
<version>${jbossas.version}</version>
<type>pom</type>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.jboss.jbossas</groupId>
<artifactId>jboss-as-depchain</artifactId>
<version>${jbossas.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
my unit test looks like this:
@RunWith(Arquillian.class)
public class PersonTest {
@Deployment
public static Archive<?> createDeployment() {
return ShrinkWrap.create(JavaArchive.class, "test.jar")
.addClasses(PersonDAO.class,PersonDAOBean.class)
.addManifestResource("META-INF/persistence.xml", ArchivePaths.create("persistence.xml"));
}
@PersistenceContext
EntityManager em;
@Inject
UserTransaction utx;
@EJB
private PersonDAO personDAO;
@Test
public void testEntityManager() {
}
}
and I kick off the test with: mvn -Pintegration-test test
Thanks,
Steve Maring
Tampa, FL