<?xml version="1.0" encoding="UTF-8"?>
<!--
  ~ Copyright 2012 AndroidPlot.com
  ~
  ~    Licensed 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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.sonatype.oss</groupId>
        <artifactId>oss-parent</artifactId>
        <version>7</version>
    </parent>

    <groupId>com.androidplot</groupId>
    <artifactId>androidplot</artifactId>
    <version>0.6.0</version>
    <name>AndroidPlot-Parent</name>
    <description>A charting library for the Android platform</description>
    <url>http://androidplot.com</url>
    <inceptionYear>2010</inceptionYear>
    <organization>
        <name>androidplot.com</name>
        <url>http://androidplot.com</url>
    </organization>
    <licenses>
        <license>
            <name>The Apache Software License, Version 2.0</name>
            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
            <distribution>repo</distribution>
            <comments>A business-friendly OSS license</comments>
          </license>
    </licenses>
    <developers>
        <developer>
          <id>Nick</id>
          <name>Nick Fellows</name>
          <email>nick@androidplot.com</email>
          <organization>AndroidPlot</organization>
          <organizationUrl>http://androidplot.com</organizationUrl>
          <roles>
            <role>architect</role>
            <role>developer</role>
          </roles>
        </developer>
        <developer>
            <id>Tim</id>
            <name>Tim Hepner</name>
            <email>tim@androidplot.com</email>
            <organization>AndroidPlot</organization>
            <organizationUrl>http://androidplot.com</organizationUrl>
            <roles>
                <role>developer</role>
            </roles>
        </developer>
    </developers>
    <packaging>pom</packaging>

    <properties>
        <!--<applicationVersion>0.5.1-SNAPSHOT</applicationVersion>-->
        <examplesDir>Examples</examplesDir>
        <!--<obfuscatedJarPath>${project.build.directory}/obfuscated</obfuscatedJarPath>
        <obfuscatedJarName>${project.build.finalName}.jar</obfuscatedJarName>-->
    </properties>

    <modules>
        <module>AndroidPlot-Core</module>
        <!--<module>Examples</module>-->
        <module>Examples/DemoApp</module>
    </modules>

    <!--<repositories>
        <repository>
            <id>java.net2</id>
            <url>http://download.java.net/maven/2/</url>
        </repository>
    </repositories>-->

    <scm>
        <connection>scm:git:https://bitbucket.org/androidplot/androidplot.git</connection>
        <developerConnection>scm:git:https://bitbucket.org/androidplot/androidplot.git</developerConnection>
        <url>https://bitbucket.org/androidplot/androidplot.git</url>
      <tag>0.6.0</tag>
  </scm>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-release-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <tagNameFormat>v@{project.version}</tagNameFormat>
                    <!-- Added to fix an issue with hidden gpg signing prompts
                    described here: http://jira.codehaus.org/browse/MGPG-9-->
                    <mavenExecutorId>forked-path</mavenExecutorId>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-deploy-plugin</artifactId>
                <version>2.7</version>
                <!--<configuration>
                    <skip>true</skip>
                </configuration>-->
            </plugin>
        </plugins>
    </build>

    <!-- dependencies to be inherited -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.google.android</groupId>
                <artifactId>android</artifactId>
                <version>4.1.1.4</version>
                <scope>provided</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>