<?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/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <parent>
    <artifactId>spring-boot</artifactId>
    <groupId>org.apache.camel</groupId>
    <version>2.20.4</version>
  </parent>

  <artifactId>camel-spring-boot-dm</artifactId>
  <packaging>pom</packaging>
  <name>Camel :: Platforms :: Spring-Boot :: Dependency Management</name>

  <modules>
    <module>camel-spring-boot-dependencies-generator</module>
    <module>camel-spring-boot-dependencies</module>
    <module>camel-starter-parent</module>
  </modules>

  <properties>
    <!-- Spring-Boot target version -->
    <spring-boot-version>1.5.8.RELEASE</spring-boot-version>

    <!-- The following dependencies should be aligned with the ones in standard camel parent -->
    <avro-version>1.8.2</avro-version>
    <cassandra-driver-guava-version>18.0</cassandra-driver-guava-version>
    <jackson-version>1.9.12</jackson-version>

    <egit-github-core-version>2.1.5</egit-github-core-version>
    <google-guava-version>19.0</google-guava-version>
    <lucene3-version>3.6.0</lucene3-version>
    <scala-version>2.11.7</scala-version>
    <scalaxml-version>1.0.6</scalaxml-version>

    <maven-checkstyle-plugin-version>2.17</maven-checkstyle-plugin-version>
    <maven-checkstyle-version>7.6.1</maven-checkstyle-version>

    <hadoop2-version>2.7.2</hadoop2-version>

    <!-- Custom dependency required by some modules -->
    <cassandra-netty-version-testing>4.0.44.Final</cassandra-netty-version-testing>
    <infinispan-spring-boot-version>1.0.0.Final</infinispan-spring-boot-version>
    <groovy-version>2.4.12</groovy-version>

    <!-- The following versions should be aligned with the ones in spring-boot-repo/spring-boot-dependencies/pom.xml (for the targeted version of spring-boot) -->
    <!-- for example: https://github.com/spring-projects/spring-boot/blob/v1.5.8.RELEASE/spring-boot-dependencies/pom.xml -->
    <jackson2-version>2.8.10</jackson2-version>
    <jetty9-version>9.4.7.v20170914</jetty9-version>
    <jetty-version>${jetty9-version}</jetty-version>
    <jna-version>4.2.2</jna-version>
    <hazelcast-version>3.7.8</hazelcast-version>
    <htmlunit-version>2.21</htmlunit-version>
    <log4j2-version>2.7</log4j2-version>
    <slf4j-version>1.7.25</slf4j-version>
    <spring-version>4.3.12.RELEASE</spring-version>
    <spring-data-releasetrain-version>Ingalls-SR7</spring-data-releasetrain-version>
    <spring-integration-version>4.3.12.RELEASE</spring-integration-version>
    <spring-security-version>4.2.3.RELEASE</spring-security-version>
  </properties>

  <build>
    <plugins>

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-checkstyle-plugin</artifactId>
        <version>${maven-checkstyle-plugin-version}</version>
        <dependencies>
          <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-buildtools</artifactId>
            <version>${project.version}</version>
          </dependency>
          <dependency>
            <groupId>com.puppycrawl.tools</groupId>
            <artifactId>checkstyle</artifactId>
            <version>${maven-checkstyle-version}</version>
          </dependency>
        </dependencies>
        <executions>
          <execution>
            <id>default-cli</id>
            <phase>validate</phase>
            <configuration>
              <includeResources>false</includeResources>
              <configLocation>camel-checkstyle.xml</configLocation>
              <consoleOutput>true</consoleOutput>
              <failsOnError>true</failsOnError>
              <linkXRef>false</linkXRef>
              <suppressionsLocation>camel-checkstyle-suppressions.xml</suppressionsLocation>
              <encoding>UTF-8</encoding>
              <sourceDirectory>${basedir}/src</sourceDirectory>
              <excludes>**/archetype-resources/**/*.java</excludes>
            </configuration>
            <goals>
              <goal>checkstyle</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>${maven-compiler-plugin-version}</version>
        <configuration>
          <source>${jdk.version}</source>
          <target>${jdk.version}</target>
          <maxmem>512M</maxmem>
          <fork>${compiler.fork}</fork>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <configuration>
          <attach>true</attach>
          <source>${jdk.version}</source>
          <quiet>true</quiet>
          <bottom>Apache Camel</bottom>
          <detectOfflineLinks>false</detectOfflineLinks>
          <javadocVersion>${jdk.version}</javadocVersion>
          <encoding>UTF-8</encoding>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
        <configuration>
          <encoding>UTF-8</encoding>
        </configuration>
      </plugin>

    </plugins>
  </build>

</project>
