<?xml version="1.0"?>
<!--
 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>
  <groupId>${ivy.pom.groupId}</groupId>
  <artifactId>${ivy.pom.artifactId}</artifactId>
  <packaging>${ivy.pom.packaging}</packaging>
  <version>${version}</version>
  <name>Apache Nutch</name>
  <description>${ivy.pom.description}</description>
  <url>${ivy.pom.url}</url>
  <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>
    </license>
  </licenses>

  <scm>
    <developerConnection>scm:git:https://github.com/apache/nutch.git</developerConnection>
    <connection>scm:git:http://github.com/apache/nutch.git</connection>
    <url>https://github.com/apache/nutch.git</url>
  </scm>

  <pluginRepositories>
    <pluginRepository>
      <id>miredot</id>
      <name>MireDot Releases</name>
      <url>http://nexus.qmino.com/content/repositories/miredot</url>
    </pluginRepository>
  </pluginRepositories>

  <developers>
    <developer>
      <id>mattmann</id>
      <name>Chris A. Mattmann</name>
      <email>mattmann@apache.org</email>
    </developer>
    <developer>
      <id>jnioche</id>
      <name>Julien Nioche</name>
      <email>jnioche@apache.org</email>
    </developer>
    <developer>
      <id>lewismc</id>
      <name>Lewis John McGibbney</name>
      <email>lewismc@apache.org</email>
    </developer>
    <developer>
      <id>markus</id>
      <name>Markus Jelsma</name>
      <email>markus@apache.org</email>
    </developer>	
    <developer>
      <id>fenglu</id>
      <name>Feng Lu</name>
      <email>fenglu@apache.org</email>
    </developer>
    <developer>
      <id>kiranch</id>
      <name>Kiran Chitturi</name>
      <email>kiranch@apache.org</email>
    </developer>
    <developer>
      <id>tejasp</id>
      <name>Tejas Patil</name> 
      <email>tejasp@apache.org</email>
    </developer>
    <developer>
      <id>talat</id>
      <name>Talat Uyarer</name>
      <email>talat@apache.org</email>
    </developer>
    <developer>
      <id>snagel</id>
      <name>Sebastian Nagel</name>
      <email>snagel@apache.org</email>
    </developer>
    <developer>
      <id>thammegowda</id>
      <name>Thamme Gowda</name>
      <email>thammegowda@apache.org</email>
    </developer>
  </developers>

  <build>
    <sourceDirectory>src/java</sourceDirectory>
    <testSourceDirectory>src/test</testSourceDirectory>
    <testResources>
      <testResource>
        <directory>src/testresources</directory>
      </testResource>
    </testResources>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <configuration>
            <source>1.8</source>
            <target>1.8</target>
          </configuration>
        </plugin>
      </plugins>
    </pluginManagement>
    <plugins>
      <plugin>
        <groupId>com.qmino</groupId>
        <artifactId>miredot-plugin</artifactId>
        <version>2.0.1</version>
        <executions>
          <execution>
            <goals>
              <goal>restdoc</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <licence>cHJvamVjdHxvcmcuYXBhY2hlLm51dGNoLm51dGNofDIwMTktMTAtMzB8dHJ1ZXwtMSNNQ3dDRkJMb0FjM283ME1YRERRMkFJemY1QmxZUjAwK0FoUkJVMlJrVi81RlBQc25zMUZ2S2g0Q29weGFxZz09</licence>
          <restModel>
            <restFramework>
              <name>jax-rs</name>
            </restFramework>
          </restModel>
          <output>
            <html></html>
          </output>
          <!-- insert other configuration here (optional) -->
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>
