<?xml version="1.0" encoding="UTF-8"?>
<!--
 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>
  <artifactId>opendapps</artifactId>
  <name>Apache OODT Configurable OPeNDAP Profile Server</name>
  <description>A generic, configurable Apache OODT profile server
  implementation that easily connects to OPeNDAP data sources. Connections 
  are configured via an XML configuration file, providing information on how 
  to extract and translate datasets from OPeNDAP and THREDDS into OODT profiles.
  </description> 
  <scm>
   	<connection>scm:svn:https://svn.apache.org/repos/asf/oodt/tags/0.7/opendapps</connection>
   	<developerConnection>scm:svn:https://svn.apache.org/repos/asf/oodt/tags/0.7/opendapps</developerConnection>
   	<url>http://svn.apache.org/viewvc/oodt/tags/0.7/opendapps</url>
  </scm>
  <parent>
    <groupId>org.apache.oodt</groupId>
    <artifactId>oodt-core</artifactId>
    <version>0.7</version>
    <relativePath>../core/pom.xml</relativePath>
  </parent>
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
        <!-- enable creation of single jar to use this module stand alone -->
        <executions>
          <execution>
            <id>make-assembly</id> <!-- this is used for inheritance merges -->
            <phase>package</phase> <!-- bind to the packaging phase -->
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  <dependencies>
   <dependency>
     <groupId>edu.ucar</groupId>
     <artifactId>netcdf</artifactId>
     <version>4.2</version>
   </dependency>
   <dependency>
    <groupId>org.apache.oodt</groupId>
    <artifactId>oodt-profile</artifactId>
    <version>${project.parent.version}</version>
   </dependency>
   <dependency>
    <groupId>org.apache.oodt</groupId>
    <artifactId>oodt-xmlquery</artifactId>
    <version>${project.parent.version}</version>
   </dependency>
  </dependencies>
</project>
