<!--
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You under the Apache License, Version 2.0
   (the "License"); you may not use this file except in compliance with
   the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
-->
<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">
  <parent>
    <groupId>org.apache.abdera</groupId>
    <artifactId>abdera</artifactId>
    <version>1.1-SNAPSHOT</version>  
  </parent>  
  <modelVersion>4.0.0</modelVersion>
  <artifactId>abdera-client</artifactId>
  <packaging>bundle</packaging>
  <name>Abdera Client</name>
  <version>1.1-SNAPSHOT</version>  
  <description>Atom Publishing Protocol Client Implementation</description>

  <properties>
    <topDir>${basedir}/..</topDir>
    <abdera.osgi.default.exports>
		org.apache.abdera.protocol.client.*
	</abdera.osgi.default.exports>
  </properties>
  <dependencies>
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
      </dependency>
      <dependency>
  		<groupId>commons-codec</groupId>
  		<artifactId>commons-codec</artifactId>
  	</dependency>
    <dependency>
      <groupId>org.apache.abdera</groupId>
      <artifactId>abdera-core</artifactId>
      <version>1.1-SNAPSHOT</version>  
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.abdera</groupId>
      <artifactId>abdera-parser</artifactId>
      <version>1.1-SNAPSHOT</version>  
      <scope>compile</scope>
    </dependency>    
    <dependency>
      <groupId>commons-httpclient</groupId>
      <artifactId>commons-httpclient</artifactId>
    </dependency>
    <dependency>
      <groupId>org.mortbay.jetty</groupId>
      <artifactId>jetty</artifactId>
      <version>${jetty.version}</version>  
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>
