<?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 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <parent>
	<artifactId>turbine-parent</artifactId>
	<groupId>org.apache.turbine</groupId>
    <version>6</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>
  
  <groupId>org.apache.fulcrum</groupId>
  <artifactId>fulcrum-template</artifactId>
  <version>2.0.0-SNAPSHOT</version>
  <name>Fulcrum Template Component</name>

  <scm>
    <connection>scm:svn:http://svn.apache.org/repos/asf/turbine/fulcrum/trunk/template/</connection>
    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/turbine/fulcrum/trunk/template/</developerConnection>
    <url>http://svn.apache.org/viewvc/turbine/fulcrum/trunk/template/</url>
  </scm>
  
   <distributionManagement>
    <site>
        <id>turbine.apache.org</id>
        <name>Fulcrum Template Website</name>
        <url>http://turbine.apache.org/fulcrum/fulcrum-template/</url>
      </site>    
     </distributionManagement> 


  <dependencies>
    <dependency>
      <groupId>commons-configuration</groupId>
      <artifactId>commons-configuration</artifactId>
      <version>1.6</version>
    </dependency>
    <dependency>
      <groupId>commons-collections</groupId>
      <artifactId>commons-collections</artifactId>
      <version>3.2.2</version>
    </dependency>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-email</artifactId>
      <version>1.2</version>
    </dependency>
   <dependency>
	    <groupId>org.apache.commons</groupId>
	    <artifactId>commons-lang3</artifactId>
	    <version>3.9</version>
	  </dependency>
    <dependency>
    	<groupId>org.apache.fulcrum</groupId>
    	<artifactId>fulcrum-yaafi</artifactId>
    	<version>1.0.8</version>
    </dependency>
    <dependency>
    	<groupId>org.apache.velocity</groupId>
    	<artifactId>velocity</artifactId>
    	<version>1.6.4</version>
    </dependency>
    <dependency>
    	<groupId>org.apache.fulcrum</groupId>
    	<artifactId>fulcrum-testcontainer</artifactId>
    	<version>1.0.8</version>
    	<type>jar</type>
    	<scope>test</scope>
    </dependency>
  </dependencies>

  <build>
  	<sourceDirectory>src/java</sourceDirectory>
  	<testSourceDirectory>src/test</testSourceDirectory>
  	<plugins>
  		<plugin>
  			<groupId>org.apache.maven.plugins</groupId>
  			<artifactId>maven-eclipse-plugin</artifactId>
  			<version>2.8</version>
  			<configuration>
  				<downloadSources>true</downloadSources>
  				<downloadJavadocs>true</downloadJavadocs>
  			</configuration>
  		</plugin>
  	</plugins>
  </build>  
  
  <properties>
    <!-- Default configuration for compiler source and target JVM -->
    <maven.compile.source>1.5</maven.compile.source>
    <maven.compile.target>1.5</maven.compile.target>
    <!-- This bits are used for the staging directory -->
    <fulcrum.release.version>2.0.0</fulcrum.release.version>
    <fulcrum.rc.version>RC1</fulcrum.rc.version>  
  </properties>  
  
  <reporting>
    <plugins>
      <plugin>
        <artifactId>maven-changes-plugin</artifactId>
        <configuration>
          <xmlPath>${basedir}/xdocs/changes.xml</xmlPath>
        </configuration>
      </plugin>
    </plugins>
  </reporting>

  <profiles>
    <profile>
      <id>rc</id>
      <distributionManagement>
        <!-- Cannot define in parent ATM, see COMMONSSITE-26 -->
        <site>
          <id>apache.website</id>
          <name>Apache Fulcrum Release Candidate Staging Site</name>
          <url>${fulcrum.deployment.protocol}://people.apache.org/www/turbine.apache.org/builds/fulcrum/${fulcrum.componentid}/${fulcrum.release.version}/${fulcrum.rc.version}/site</url>
        </site>
      </distributionManagement>
    </profile>
  </profiles>
  
</project>
