You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by Gary Weaver <ga...@duke.edu> on 2008/06/11 18:00:40 UTC
Problem with CXF 2.0.6 and 2.1 setting objects on request to null
when they are defined in response
Hello,
I'm having a problem in CXF 2.0.6, 2.1, and 2.1-SNAPSHOT
(20080605.204511-10) where objects on the response object are null, but
from looking at the output of the SOAP response coming back, logged by
CXF, CXF should have set those objects on the response.
For example, in the code in TestClient.java below, when I call
sendRequest(...) I get back a response object, and I can see in the logs
the SOAP request and response, and they look good (the response has all
of the fields it is supposed to). However, when I call any of the get
methods on the response to get at the request data, they all return null. :(
An additional mystery (which may have something to do with it?) is that
I've found that when I don't setAllowChunking(false) on a policy and set
on the conduit, I get a server error back from the service I'm calling.
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
httpClientPolicy.setAllowChunking(false);
conduit.setClient(httpClientPolicy);
Could you take a quick look at the code below and let me know if there
is anything I'm doing that I shouldn't be doing or should be doing
differently?
Also, please let me know if there is anything I should look at to
determine why it isn't serializing the response back correctly. I have
full debug logging on in log4j.properties.
Thanks in advance,
Gary
Here are the classes:
TestClient.java
===========
...
import org.apache.cxf.configuration.jsse.TLSClientParameters;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.endpoint.Endpoint;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.transport.http.HTTPConduit;
import org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor;
import org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor;
import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
import org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor;
import org.apache.cxf.binding.soap.saaj.SAAJInInterceptor;
import org.apache.ws.security.WSConstants;
import org.apache.ws.security.handler.WSHandlerConstants;
import javax.xml.ws.BindingProvider;
import java.util.HashMap;
import java.util.Map;
...
public class TestClient {
private static String URL =
"https://some.host:1234/path/to/the/service";
private TestClient() {
}
public static MyServiceResponseTypeShape sendRequest(String
someRequestParam) throws Exception {
MyService service = new MyService();
MyServicePortType portType = service.getMyServicePort();
Client client = ClientProxy.getClient(portType);
Endpoint endpoint = client.getEndpoint();
// Enable Logging
// from http://cwiki.apache.org/CXF20DOC/debugging.html
client.getInInterceptors().add(new LoggingInInterceptor());
client.getOutInterceptors().add(new LoggingOutInterceptor());
HTTPConduit conduit = (HTTPConduit) client.getConduit();
// for more info see:
http://cwiki.apache.org/confluence/display/CXF20DOC/Client+HTTP+Transport+%28including+SSL+support%29
// set timeout
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
//httpClientPolicy.setConnectionTimeout(36000);
httpClientPolicy.setAllowChunking(false);
//httpClientPolicy.setReceiveTimeout(32000);
conduit.setClient(httpClientPolicy);
// set endpoint, since the default one in the wsdl has wrong
protocol and port
TLSClientParameters params = conduit.getTlsClientParameters();
if (params == null) {
params = new TLSClientParameters();
conduit.setTlsClientParameters(params);
}
// NOTE! ONLY DO THIS FOR TESTING, NOT PRODUCTION!
// this is to get around the error:
// The https URL hostname does not match the Common Name (CN) on
the server certificate. To disable this check (NOT recommended for
production) set the CXF client TLS configuration property
"disableCNCheck" to true.
params.setDisableCNCheck(true);
// override the endpoint that is defined in WSDL as http with
old port to be https with new port
((BindingProvider)
portType).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
URL);
// set username and password
// see: http://cwiki.apache.org/CXF20DOC/ws-security.html
// No security on client-side
Map<String, Object> inProps = new HashMap<String, Object>();
inProps.put(WSHandlerConstants.ACTION,
WSHandlerConstants.NO_SECURITY);
WSS4JInInterceptor wssIn = new WSS4JInInterceptor(inProps);
endpoint.getInInterceptors().add(wssIn);
endpoint.getInInterceptors().add(new SAAJInInterceptor()); //
2.0.x only; not needed in 2.1+
// Server-side authN
Map<String, Object> outProps = new HashMap<String, Object>();
outProps.put(WSHandlerConstants.ACTION,
WSHandlerConstants.USERNAME_TOKEN);
outProps.put(WSHandlerConstants.USER, "my_username");
outProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
//outProps.put(WSHandlerConstants.PASSWORD_TYPE,
WSConstants.PW_DIGEST);
outProps.put(WSHandlerConstants.PW_CALLBACK_CLASS,
MyCallbackHandler.class.getName());
WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps);
endpoint.getOutInterceptors().add(wssOut);
endpoint.getOutInterceptors().add(new SAAJOutInterceptor()); //
2.0.x only; not needed in 2.1+
// note: createMyServiceRequestTypeShape() is a method on this
class that creates the request object
MyServiceRequestTypeShape req =
createMyServiceRequestTypeShape(someRequestParam);
return portType.doSomething(req);
}
public MyServiceRequestTypeShape
createMyServiceRequestTypeShape(String someRequestParam) {
...
}
}
MyCallbackHandler.java
==================
...
import org.apache.ws.security.WSPasswordCallback;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.UnsupportedCallbackException;
import javax.security.auth.callback.CallbackHandler;
import java.io.IOException;
public class MyCallbackHandler implements CallbackHandler {
public void handle(Callback[] callbacks) throws IOException,
UnsupportedCallbackException {
WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
// set the password for our message.
pc.setPassword("my_password");
}
}
pom.xml
======
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cxftestclient</groupId>
<artifactId>cxftestclient</artifactId>
<packaging>jar</packaging>
<name>CXF Integration Test</name>
<version>1.0-SNAPSHOT</version>
<properties>
<cxf.version>2.1.1-SNAPSHOT</cxf.version>
</properties>
<dependencies>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<groupId>logkit</groupId>
<artifactId>logkit</artifactId>
</exclusion>
<exclusion>
<groupId>avalon-framework</groupId>
<artifactId>avalon-framework</artifactId>
</exclusion>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-ws-security</artifactId>
<version>${cxf.version}</version>
</dependency>
<!-- Jetty is needed if you're are not using the CXFServlet -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>${cxf.version}</version>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<sourceRoot>${basedir}/target/generated/src/main/java</sourceRoot>
<wsdlOptions>
<wsdlOption>
<wsdl>${basedir}/src/main/wsdl/myService.wsdl</wsdl>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<reportFormat>brief</reportFormat>
<useFile>false</useFile>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>central-m2-repository</id>
<name>Central Maven 2 Repository</name>
<url>http://repo1.maven.org/maven2</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>apache.org</id>
<name>Maven Snapshots</name>
<url>http://people.apache.org/repo/m2-snapshot-repository</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central-m2-repository</id>
<name>Central Maven 2 Repository</name>
<url>http://repo1.maven.org/maven2</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
<pluginRepository>
<id>apache.org</id>
<name>Maven Plugin Snapshots</name>
<url>http://people.apache.org/repo/m2-snapshot-repository</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>
Re: Problem with CXF 2.0.6 and 2.1 setting objects on request to
null when they are defined in response
Posted by Gary Weaver <ga...@duke.edu>.
Daniel,
Daniel Kulp wrote:
> Most likely, the response isn't correct compared to what CXF is
> expecting (actually, in this case, JAXB as CXF has nothing to do with
> this part). The usual culprit for this is element qualification
> issues and without seeing the wsdl/schema and the actual soap message,
> it would be hard for me to diagnose. Double check the soap message
> to make sure the child elements are qualified or not qualified as per
> the schema in the wsdl. If the schema has
> elementFormDefault=unqualified (or no elementFormDefault), the
> elements should be unqualifed. If the schema says
> elementFormDefault=qualified, they need to be qualified.
Thanks!!! In the wsdl it specifies elementFormDefault="qualified"(twice,
once for request namespace and once for response namespace). In the
response, the namespace is only defined once in the first element of the
data within the response, and it isn't the same namespace as the one
defined for the response in the WSDL. So the namespace in the response
not matching the namespace in the request was the problem.
I just verified that was the case by changing the response's namespace
in the WSDL to match the namespace of the actual response and it finally
works!!! (I'm now waiting on our guys to see if they can make the
response namespace match the one that is defined for the response in the
WSDL.)
Thanks again!!!
>>
>> An additional mystery (which may have something to do with it?) is
>> that I've found that when I don't setAllowChunking(false) on a policy
>> and set on the conduit, I get a server error back from the service
>> I'm calling.
>
>
> Some of the older services toolkits don't support chunking. Turning
> chunking off drops performance by nearly 10% in some cases and
> consumes more memory, but is required when working with some older
> toolkits.
>
Thanks! I'll make sure to try to get a request in for them to update
their service to support chunking.
Gary
--
Gary Weaver
Internet Framework Services
Office of Information Technology
Duke University
Re: Problem with CXF 2.0.6 and 2.1 setting objects on request to null when they are defined in response
Posted by Daniel Kulp <dk...@apache.org>.
On Jun 11, 2008, at 12:00 PM, Gary Weaver wrote:
> Hello,
>
> I'm having a problem in CXF 2.0.6, 2.1, and 2.1-SNAPSHOT
> (20080605.204511-10) where objects on the response object are null,
> but from looking at the output of the SOAP response coming back,
> logged by CXF, CXF should have set those objects on the response.
>
> For example, in the code in TestClient.java below, when I call
> sendRequest(...) I get back a response object, and I can see in the
> logs the SOAP request and response, and they look good (the response
> has all of the fields it is supposed to). However, when I call any
> of the get methods on the response to get at the request data, they
> all return null. :(
Most likely, the response isn't correct compared to what CXF is
expecting (actually, in this case, JAXB as CXF has nothing to do with
this part). The usual culprit for this is element qualification
issues and without seeing the wsdl/schema and the actual soap message,
it would be hard for me to diagnose. Double check the soap message
to make sure the child elements are qualified or not qualified as per
the schema in the wsdl. If the schema has
elementFormDefault=unqualified (or no elementFormDefault), the
elements should be unqualifed. If the schema says
elementFormDefault=qualified, they need to be qualified.
>
> An additional mystery (which may have something to do with it?) is
> that I've found that when I don't setAllowChunking(false) on a
> policy and set on the conduit, I get a server error back from the
> service I'm calling.
Some of the older services toolkits don't support chunking. Turning
chunking off drops performance by nearly 10% in some cases and
consumes more memory, but is required when working with some older
toolkits.
Dan
>
>
> HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
> httpClientPolicy.setAllowChunking(false);
> conduit.setClient(httpClientPolicy);
>
> Could you take a quick look at the code below and let me know if
> there is anything I'm doing that I shouldn't be doing or should be
> doing differently?
>
> Also, please let me know if there is anything I should look at to
> determine why it isn't serializing the response back correctly. I
> have full debug logging on in log4j.properties.
>
> Thanks in advance,
> Gary
>
>
> Here are the classes:
>
> TestClient.java
> ===========
>
> ...
> import org.apache.cxf.configuration.jsse.TLSClientParameters;
> import org.apache.cxf.endpoint.Client;
> import org.apache.cxf.endpoint.Endpoint;
> import org.apache.cxf.frontend.ClientProxy;
> import org.apache.cxf.interceptor.LoggingInInterceptor;
> import org.apache.cxf.interceptor.LoggingOutInterceptor;
> import org.apache.cxf.transport.http.HTTPConduit;
> import org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor;
> import org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor;
> import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
> import org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor;
> import org.apache.cxf.binding.soap.saaj.SAAJInInterceptor;
> import org.apache.ws.security.WSConstants;
> import org.apache.ws.security.handler.WSHandlerConstants;
>
> import javax.xml.ws.BindingProvider;
> import java.util.HashMap;
> import java.util.Map;
> ...
>
> public class TestClient {
>
> private static String URL = "https://some.host:1234/path/to/the/service
> ";
>
> private TestClient() {
> }
>
> public static MyServiceResponseTypeShape sendRequest(String
> someRequestParam) throws Exception {
> MyService service = new MyService();
> MyServicePortType portType = service.getMyServicePort();
>
> Client client = ClientProxy.getClient(portType);
> Endpoint endpoint = client.getEndpoint();
>
> // Enable Logging
> // from http://cwiki.apache.org/CXF20DOC/debugging.html
> client.getInInterceptors().add(new LoggingInInterceptor());
> client.getOutInterceptors().add(new LoggingOutInterceptor());
>
> HTTPConduit conduit = (HTTPConduit) client.getConduit();
>
> // for more info see: http://cwiki.apache.org/confluence/display/CXF20DOC/Client+HTTP+Transport+%28including+SSL+support%29
> // set timeout
> HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
> //httpClientPolicy.setConnectionTimeout(36000);
> httpClientPolicy.setAllowChunking(false);
> //httpClientPolicy.setReceiveTimeout(32000);
> conduit.setClient(httpClientPolicy);
>
> // set endpoint, since the default one in the wsdl has wrong
> protocol and port
> TLSClientParameters params = conduit.getTlsClientParameters();
> if (params == null) {
> params = new TLSClientParameters();
> conduit.setTlsClientParameters(params);
> }
>
> // NOTE! ONLY DO THIS FOR TESTING, NOT PRODUCTION!
> // this is to get around the error:
> // The https URL hostname does not match the Common Name (CN)
> on the server certificate. To disable this check (NOT recommended
> for production) set the CXF client TLS configuration property
> "disableCNCheck" to true.
> params.setDisableCNCheck(true);
>
> // override the endpoint that is defined in WSDL as http with
> old port to be https with new port ((BindingProvider)
> portType
> ).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
> URL);
>
> // set username and password
> // see: http://cwiki.apache.org/CXF20DOC/ws-security.html
> // No security on client-side
> Map<String, Object> inProps = new HashMap<String, Object>();
> inProps.put(WSHandlerConstants.ACTION,
> WSHandlerConstants.NO_SECURITY);
> WSS4JInInterceptor wssIn = new WSS4JInInterceptor(inProps);
> endpoint.getInInterceptors().add(wssIn);
> endpoint.getInInterceptors().add(new SAAJInInterceptor()); //
> 2.0.x only; not needed in 2.1+
> // Server-side authN
> Map<String, Object> outProps = new HashMap<String, Object>();
> outProps.put(WSHandlerConstants.ACTION,
> WSHandlerConstants.USERNAME_TOKEN);
> outProps.put(WSHandlerConstants.USER, "my_username");
> outProps.put(WSHandlerConstants.PASSWORD_TYPE,
> WSConstants.PW_TEXT);
> //outProps.put(WSHandlerConstants.PASSWORD_TYPE,
> WSConstants.PW_DIGEST);
> outProps.put(WSHandlerConstants.PW_CALLBACK_CLASS,
> MyCallbackHandler.class.getName());
> WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps);
> endpoint.getOutInterceptors().add(wssOut);
> endpoint.getOutInterceptors().add(new
> SAAJOutInterceptor()); // 2.0.x only; not needed in 2.1+
>
> // note: createMyServiceRequestTypeShape() is a method on this
> class that creates the request object
> MyServiceRequestTypeShape req =
> createMyServiceRequestTypeShape(someRequestParam);
>
> return portType.doSomething(req);
> }
>
> public MyServiceRequestTypeShape
> createMyServiceRequestTypeShape(String someRequestParam) {
> ...
> }
> }
>
> MyCallbackHandler.java
> ==================
>
> ...
>
> import org.apache.ws.security.WSPasswordCallback;
>
> import javax.security.auth.callback.Callback;
> import javax.security.auth.callback.UnsupportedCallbackException;
> import javax.security.auth.callback.CallbackHandler;
> import java.io.IOException;
>
> public class MyCallbackHandler implements CallbackHandler {
>
> public void handle(Callback[] callbacks) throws IOException,
> UnsupportedCallbackException {
>
> WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
>
> // set the password for our message.
> pc.setPassword("my_password");
> }
>
> }
>
> pom.xml
> ======
>
> <project xmlns="http://maven.apache.org/POM/4.0.0"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd
> ">
>
> <modelVersion>4.0.0</modelVersion>
>
> <groupId>cxftestclient</groupId>
> <artifactId>cxftestclient</artifactId>
> <packaging>jar</packaging>
>
> <name>CXF Integration Test</name>
> <version>1.0-SNAPSHOT</version>
>
> <properties>
> <cxf.version>2.1.1-SNAPSHOT</cxf.version>
> </properties>
>
> <dependencies>
> <dependency>
> <groupId>commons-logging</groupId>
> <artifactId>commons-logging</artifactId>
> <version>1.1</version>
> <scope>provided</scope>
> <exclusions>
> <exclusion>
> <groupId>logkit</groupId>
> <artifactId>logkit</artifactId>
> </exclusion>
> <exclusion>
> <groupId>avalon-framework</groupId>
> <artifactId>avalon-framework</artifactId>
> </exclusion>
> <exclusion>
> <groupId>javax.servlet</groupId>
> <artifactId>servlet-api</artifactId>
> </exclusion>
> </exclusions>
> </dependency>
>
> <dependency>
> <groupId>org.apache.cxf</groupId>
> <artifactId>cxf-rt-frontend-jaxws</artifactId>
> <version>${cxf.version}</version>
> </dependency>
>
> <dependency>
> <groupId>org.apache.cxf</groupId>
> <artifactId>cxf-rt-transports-http</artifactId>
> <version>${cxf.version}</version>
> </dependency>
>
> <dependency>
> <groupId>org.apache.cxf</groupId>
> <artifactId>cxf-rt-ws-security</artifactId>
> <version>${cxf.version}</version>
> </dependency>
>
> <!-- Jetty is needed if you're are not using the CXFServlet -->
> <dependency>
> <groupId>org.apache.cxf</groupId>
> <artifactId>cxf-rt-transports-http-jetty</artifactId>
> <version>${cxf.version}</version>
> </dependency>
>
> <dependency>
> <groupId>junit</groupId>
> <artifactId>junit</artifactId>
> <version>3.8.1</version>
> <scope>test</scope>
> </dependency>
> </dependencies>
>
> <build>
> <plugins>
> <plugin>
> <artifactId>maven-compiler-plugin</artifactId>
> <configuration>
> <source>1.5</source>
> <target>1.5</target>
> </configuration>
> </plugin>
>
> <plugin>
> <groupId>org.apache.cxf</groupId>
> <artifactId>cxf-codegen-plugin</artifactId>
> <version>${cxf.version}</version>
> <executions>
> <execution>
> <id>generate-sources</id>
> <phase>generate-sources</phase>
> <configuration>
> <sourceRoot>${basedir}/target/generated/
> src/main/java</sourceRoot>
> <wsdlOptions>
> <wsdlOption>
> <wsdl>${basedir}/src/main/wsdl/
> myService.wsdl</wsdl>
> </wsdlOption>
> </wsdlOptions>
> </configuration>
> <goals>
> <goal>wsdl2java</goal>
> </goals>
> </execution>
> </executions>
> </plugin>
>
> <plugin>
> <groupId>org.apache.maven.plugins</groupId>
> <artifactId>maven-surefire-plugin</artifactId>
> <configuration>
> <reportFormat>brief</reportFormat>
> <useFile>false</useFile>
> </configuration>
> </plugin>
> </plugins>
> </build>
>
> <repositories>
> <repository>
> <id>central-m2-repository</id>
> <name>Central Maven 2 Repository</name>
> <url>http://repo1.maven.org/maven2</url>
> <snapshots>
> <enabled>true</enabled>
> </snapshots>
> </repository>
>
> <repository>
> <id>apache.org</id>
> <name>Maven Snapshots</name>
> <url>http://people.apache.org/repo/m2-snapshot-repository</
> url>
> <releases>
> <enabled>false</enabled>
> </releases>
> <snapshots>
> <enabled>true</enabled>
> </snapshots>
> </repository>
> </repositories>
>
> <pluginRepositories>
> <pluginRepository>
> <id>central-m2-repository</id>
> <name>Central Maven 2 Repository</name>
> <url>http://repo1.maven.org/maven2</url>
> <snapshots>
> <enabled>true</enabled>
> </snapshots>
> </pluginRepository>
>
> <pluginRepository>
> <id>apache.org</id>
> <name>Maven Plugin Snapshots</name>
> <url>http://people.apache.org/repo/m2-snapshot-repository</
> url>
> <releases>
> <enabled>false</enabled>
> </releases>
> <snapshots>
> <enabled>true</enabled>
> </snapshots>
> </pluginRepository>
> </pluginRepositories>
> </project>
>
>
---
Daniel Kulp
dkulp@apache.org
http://www.dankulp.com/blog