<?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">

  <parent>
    <groupId>org.apache.jspwiki</groupId>
    <artifactId>jspwiki-builder</artifactId>
    <version>2.11.0.M6-SNAPSHOT</version>
  </parent>

  <modelVersion>4.0.0</modelVersion>
  <artifactId>jspwiki-wikipages-builder</artifactId>
  <groupId>org.apache.jspwiki.wikipages</groupId>
  <name>Apache JSPWiki initial wiki pages builder</name>
  <packaging>pom</packaging>

  <modules>
    <module>de</module>
    <module>en</module>
    <module>es</module>
    <module>fi</module>
    <module>fr</module>
    <module>it</module>
    <module>nl</module>
    <module>pt_BR</module>
    <module>ru</module>
    <module>zh_CN</module>
  </modules>
  
  <build>
    <pluginManagement>
	  <plugins>
	    <plugin><!-- exclude bundled wikipages from RAT analysis -->
          <groupId>org.apache.rat</groupId>
          <artifactId>apache-rat-plugin</artifactId>
          <version>0.11</version>
          <configuration>
            <excludes>
              <exclude>**/src/main/resources/*.txt</exclude>
            </excludes>
          </configuration>
        </plugin>
	  </plugins>
	</pluginManagement>
  </build>
</project>
