<!--
   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>
   
  <groupId>org.apache.abdera2</groupId>
  <artifactId>abdera2-common</artifactId>
  
  <packaging>bundle</packaging>
  
  <name>Abdera2 Common Library</name>
  <version>2.0-SNAPSHOT</version>  
  <description>Abdera2 Common Code Library.</description>
  <url>http://abdera.apache.org</url>
   
  <properties>
    <topDir>${basedir}/..</topDir>
    <!--
    <abdera.osgi.default.exports>
      org.apache.abdera2.common.*
    </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.geronimo.specs</groupId>
      <artifactId>geronimo-activation_1.1_spec</artifactId>
      <version>1.1</version>  
      <scope>compile</scope>
    </dependency>

    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
    </dependency>

    <dependency>
      <groupId>commons-codec</groupId>
      <artifactId>commons-codec</artifactId>
    </dependency>

    <dependency>
      <groupId>javax</groupId>
      <artifactId>javaee-web-api</artifactId>
    </dependency>

    <dependency>
      <groupId>com.ibm.icu</groupId>
      <artifactId>icu4j</artifactId>
    </dependency>

  </dependencies>
</project>
