<!--
   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">
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>org.apache.abdera2</groupId>
    <artifactId>abdera2</artifactId>
    <version>2.0-SNAPSHOT</version>  
  </parent>  

  <artifactId>abdera2-client</artifactId>
  <packaging>bundle</packaging>
  <name>Abdera2 Client</name>
  <version>2.0-SNAPSHOT</version>  
  <description>Atom Publishing Protocol Client Implementation</description>

  <properties>
    <topDir>${basedir}/..</topDir>
    <!-- 
    <abdera.osgi.default.exports>
		  org.apache.abdera2.protocol.client.*
	  </abdera.osgi.default.exports>
    <abdera.osgi.default.imports>
      org.apache.commons.codec*;version="[1.5,2)",
      *
    </abdera.osgi.default.imports>
    -->
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.apache.abdera2</groupId>
      <artifactId>abdera2-core</artifactId>
      <version>2.0-SNAPSHOT</version>  
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.abdera2</groupId>
      <artifactId>abdera2-common</artifactId>
      <version>2.0-SNAPSHOT</version>  
      <scope>compile</scope>
    </dependency>   
    <dependency>
      <groupId>org.apache.abdera2</groupId>
      <artifactId>abdera2-activities</artifactId>
      <version>2.0-SNAPSHOT</version>  
      <scope>compile</scope>
    </dependency> 
    
      <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
      </dependency>
      
      <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpmime</artifactId>
      </dependency>
      
      <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpcore</artifactId>
      </dependency>
         
      <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient-cache</artifactId>
      </dependency>
     
  </dependencies>
</project>
