Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[jetty-users] jetty-maven-plugin v8, failsafe and JNDI failure

Hi there,

I have been using the jetty-maven-plugin in combination with the
maven-failsafe-plugin to start and stop jetty before and after our
integration tests are executed.

So far this has worked well, however we are trying to move to JNDI for
our database connections, rather than configuring them directly
through our Spring  applicationContext.xml

We are using version 8.1.8.v20121106 of the jetty-maven-plugin, and
even though Jetty appears to start the C3P0 connection pool we define
in its JNDI connection, when our Web App tries to get a JNDI
datasource, it always fails with the error:

javax.naming.NameNotFoundException; remaining name 'jdbc/substitute'

The jetty part of our Maven pom.xml looks like this:

<plugin>
                    <groupId>org.mortbay.jetty</groupId>
                    <artifactId>jetty-maven-plugin</artifactId>
                    <configuration>
                        <scanIntervalSeconds>10</scanIntervalSeconds>
                        <stopPort>8995</stopPort>
                        <stopKey>STOP</stopKey>
                        <contextPath>/</contextPath>
                        <connectors>
                            <connector
implementation="org.eclipse.jetty.server.nio.SelectChannelConnector">
                                <port>8990</port>
                                <maxIdleTime>60000</maxIdleTime>
                            </connector>
                        </connectors>
                        <systemProperties>
                            <systemProperty>
                                <name>substitutes.folder</name>
                                <value>target/test/substitutes</value>
                            </systemProperty>
                            <systemProperty>
                                <name>temp.folder</name>
                                <value>target/test/tmp/substitutes</value>
                            </systemProperty>
                        </systemProperties>

<jettyConfig>src/test/resources/jetty-config.xml</jettyConfig>
                    </configuration>
                    <executions>
                        <execution>
                            <id>start-jetty</id>
                            <phase>pre-integration-test</phase>
                            <goals>
                                <goal>run-exploded</goal>
                            </goals>
                            <configuration>
                                <scanIntervalSeconds>0</scanIntervalSeconds>
                                <daemon>true</daemon>
                            </configuration>
                        </execution>
                        <execution>
                            <id>stop-jetty</id>
                            <phase>post-integration-test</phase>
                            <goals>
                                <goal>stop</goal>
                            </goals>
                        </execution>
                    </executions>
                    <dependencies>
                        <dependency>
                            <groupId>c3p0</groupId>
                            <artifactId>c3p0</artifactId>
                            <version>${c3p0.version}</version>
                            <scope>runtime</scope>
                        </dependency>
                        <dependency>
                            <groupId>hsqldb</groupId>
                            <artifactId>hsqldb</artifactId>
                            <version>1.8.0.10</version>
                            <scope>runtime</scope>
                        </dependency>
                    </dependencies>
                </plugin>

The jetty-config.xml file referenced in the pom.xml above looks like this:

<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN"
"http://www.eclipse.org/jetty/configure.dtd";>
<Configure id="Server" class="org.eclipse.jetty.server.Server">

    <New id="substituteServer" class="org.eclipse.jetty.plus.jndi.Resource">
        <Arg>jdbc/substitute</Arg>
        <Arg>
            <New class="com.mchange.v2.c3p0.ComboPooledDataSource">
                <Set name="driverClass">org.hsqldb.jdbc.JDBCDriver</Set>
                <Set name="jdbcUrl">jdbc:hsqldb:mem:test</Set>
                <Set name="user">SA</Set>
                <Set name="password"></Set>
            </New>
         </Arg>
    </New>
</Configure>

When we run 'mvn clean install' and it gets to the failsafe plugin, we
see the following on the console:

[INFO]
[INFO] <<< jetty-maven-plugin:8.1.8.v20121106:run-exploded
(start-jetty) @ substitute-server <<<
[INFO]
[INFO] --- jetty-maven-plugin:8.1.8.v20121106:run-exploded
(start-jetty) @ substitute-server ---
[INFO] Configuring Jetty for project: substitute-server
[INFO] Configuring Jetty from xml configuration file =
/home/dev/svn-root/trunk/substitute/substitute-server/src/test/resources/jetty-config.xml
Dec 4, 2012 4:20:24 PM com.mchange.v2.log.MLog <clinit>
INFO: MLog clients using java 1.4+ standard logging.
Dec 4, 2012 4:20:24 PM com.mchange.v2.c3p0.C3P0Registry banner
INFO: Initializing c3p0-0.9.1.2 [built 21-May-2007 15:04:56; debug?
true; trace: 10]
[INFO] Context path = /
[INFO] Tmp directory =
/home/dev/svn-root/trunk/substitute/substitute-server/target/tmp
[INFO] Web defaults = org/eclipse/jetty/webapp/webdefault.xml
[INFO] Web overrides =  none
2012-12-04 16:20:25.070:INFO:oejs.Server:jetty-8.1.8.v20121106
2012-12-04 16:20:26.621:INFO:oejpw.PlusConfiguration:No Transaction
manager found - if your webapp requires one, please configure one.
Null identity service, trying login service: null
Finding identity service: null
2012-12-04 16:20:36.829:INFO:oejsh.ContextHandler:started
o.m.j.p.JettyWebAppContext{/,file:/home/dev/svn-root/trunk/substitute/substitute-server/target/substitute-server-3.0-SNAPSHOT/},/home/dev/svn-root/trunk/substitute/substitute-server/target/substitute-server-3.0-SNAPSHOT

In the above output I can see that Jetty indeed started up the c3p0
connection pool, so from that I assume that it should have bound the
JNDI resource, however as Jetty then starts up our Spring Web App, I
see the following:

Related cause: org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'substituteDataSource': Invocation of
init method failed; nested exception is
javax.naming.NameNotFoundException; remaining name 'jdbc/substitute'

The related Spring config looks like:

<jee:jndi-lookup id="substituteDataSource"
jndi-name="java:comp/env/jdbc/substitute"
expected-type="javax.sql.DataSource"/>

So my question is, why can spring not bind to the JNDI resource that
we have setup in Jetty?

Thanks Adam.


--
Adam Retter

skype: adam.retter
tweet: adamretter
http://www.adamretter.org.uk


Back to the top