<!--
Copyright 2011 Normation SAS

Licensed 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>

  <groupId>com.normation</groupId>
  <artifactId>parent-pom</artifactId>
  <version>8.3.4</version>
  <packaging>pom</packaging>

  <!-- ====================================  PROJECT INFORMATION  ==================================== -->

  <description>
    Rudder helps you continuously configure and check compliance of your infrastructure.
  </description>

  <organization>
    <name>rudder.io</name>
    <url>https://rudder.io</url>
  </organization>

  <scm>
    <url>https://github.com/Normation/rudder/</url>
  </scm>

  <!-- we can't put a licenses tag here, else for some reason it overrides utils one -->
  <modules>
    <module>utils</module>
    <module>scala-ldap</module>
    <module>ldap-inventory</module>
    <module>rudder</module>
 </modules>

  <!-- developpers information can be better found in Git commit history -->

  <!-- ====================================  /PROJECT INFORMATION  ==================================== -->

  <!-- ====================================  PROJECT REPOS  ==================================== -->

  <repositories>
    <repository>
      <id>maven_central</id>
      <name>Default maven repository</name>
      <url>https://repo1.maven.org/maven2/</url>
      <snapshots><enabled>true</enabled></snapshots>
    </repository>
    <repository>
      <id>rudder-release</id>
      <url>https://repository.rudder.io/maven/releases/</url>
      <layout>default</layout>
      <snapshots><enabled>false</enabled></snapshots>
    </repository>
    <repository>
      <id>rudder-snapshot</id>
      <url>https://repository.rudder.io/maven/snapshots/</url>
      <layout>default</layout>
      <snapshots><enabled>true</enabled></snapshots>
    </repository>
  </repositories>

  <!-- ====================================  /PROJECT REPOS  ==================================== -->

  <!-- ====================================  PROJECT BUILD  ==================================== -->

  <distributionManagement>
    <snapshotRepository>
      <id>snapshots.nexus.normation.com</id>
      <name>Normation internal nexus repository for snapshots</name>
      <url>https://nexus.normation.com/nexus/content/repositories/snapshots</url>
    </snapshotRepository>
    <repository>
      <id>releases.nexus.normation.com</id>
      <name>Normation internal nexus repository for release</name>
      <url>https://nexus.normation.com/nexus/content/repositories/releases</url>
    </repository>
  </distributionManagement>

  <reporting>
    <plugins>
      <plugin>
        <groupId>net.alchim31.maven</groupId>
        <artifactId>scala-maven-plugin</artifactId>
        <version>${scala-maven-plugin-version}</version>
      </plugin>
    </plugins>
  </reporting>

  <build>
    <extensions>
      <extension>
        <groupId>org.apache.maven.wagon</groupId>
        <artifactId>wagon-ssh</artifactId>
        <version>3.5.2</version>
      </extension>
    </extensions>
    <plugins>
      <plugin>
        <groupId>io.github.evis</groupId>
        <artifactId>scalafix-maven-plugin_2.13</artifactId>
        <version>0.1.8_0.11.0</version>
        <dependencies>
          <dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-rewrites_2.13</artifactId>
            <version>0.1.5</version>
          </dependency>
          <dependency>
            <groupId>ch.epfl.scala</groupId>
            <artifactId>scala3-migrate-rules_2.13</artifactId>
            <version>0.7.2</version>
          </dependency>
        </dependencies>
      </plugin>
      <plugin>
        <!-- Specify maven resources plugin version because to avoid this bug from plugin 3.2+ https://issues.apache.org/jira/browse/MRESOURCES-269
	especially with maven 3.9 that uses version 3.3.0 of this plugin by default, see https://issues.rudder.io/issues/22403
	-->
        <artifactId>maven-resources-plugin</artifactId>
        <version>3.1.0</version>
      </plugin>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>cobertura-maven-plugin</artifactId>
        <version>2.7</version>
        <configuration>
          <formats>
            <format>html</format>
            <format>xml</format>
          </formats>
          <check/>
        </configuration>
      </plugin>
       <plugin>
        <groupId>net.alchim31.maven</groupId>
        <artifactId>scala-maven-plugin</artifactId>
        <version>${scala-maven-plugin-version}</version>
        <executions>
          <execution>
            <id>scala-compile-first</id>
            <phase>process-resources</phase>
            <goals>
              <goal>add-source</goal>
              <goal>compile</goal>
            </goals>
          </execution>
          <execution>
            <id>scala-test-compile</id>
            <phase>process-test-resources</phase>
            <goals>
              <goal>testCompile</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <scalaCompatVersion>${scala-binary-version}</scalaCompatVersion>
          <recompileMode>all</recompileMode>
          <compilerPlugins>
            <compilerPlugin>
              <groupId>org.scalameta</groupId>
              <artifactId>semanticdb-scalac_${scala-version}</artifactId>
              <version>4.13.2</version>
            </compilerPlugin>
          </compilerPlugins>
          <args>
            <arg>-release:17</arg>
            <arg>-dependencyfile</arg>
            <arg>${basedir}/.scala_dependencies</arg>
            <!-- standard warning, most of the one from https://tpolecat.github.io/2017/04/25/scalac-flags.html -->
            <!-- corresponding scala line:
              -language:existentials -language:higherKinds -language:implicitConversions
              -Xlint:_,-nullary-unit,-missing-interpolator -Yno-adapted-args -Ywarn-dead-code -Ywarn-extra-implicit -Ywarn-inaccessible
              -Ywarn-infer-any -Ywarn-nullary-override -Ywarn-numeric-widen -Ywarn-unused:imports -Ywarn-unused:locals -Ywarn-unused:privates
            -->
            <arg>-Xsource:3-cross</arg>
            <arg>-deprecation</arg>                  <!-- Emit warning and location for usages of deprecated APIs. -->
            <arg>-explaintypes</arg>                 <!-- Explain type errors in more detail. -->
            <arg>-feature</arg>                      <!-- Emit warning and location for usages of features that should be imported explicitly. -->
            <arg>-unchecked</arg>                    <!-- Enable additional warnings where generated code depends on assumptions. -->
            <arg>-language:existentials</arg>        <!-- Existential types (besides wildcard types) can be written and inferred -->
            <arg>-language:higherKinds</arg>         <!-- Allow higher-kinded types -->
            <arg>-language:implicitConversions</arg> <!-- Allow definition of implicit functions called views -->
            <arg>-Xcheckinit</arg>                   <!--  Wrap field accessors to throw an exception on uninitialized access. -->
            <!-- Xlint, minus non-local returns, nullary-units and missing interpolator (which brings false positive in Rudder).
                 For -byname-implicit, it's because of Doobie, see: https://gitter.im/tpolecat/doobie?at=5f59e618765d633c54e74d52
            -->
            <arg>-Xfatal-warnings</arg>              <!-- Fail the compilation if there are any warnings. -->
            <arg>-Xlint:_,-nonlocal-return,-nullary-unit,-missing-interpolator,-byname-implicit</arg>
            <arg>-Ywarn-dead-code</arg>              <!-- Warn when dead code is identified. -->

            <arg>-Ywarn-extra-implicit</arg>         <!-- Warn when more than one implicit parameter section is defined. -->
            <arg>-Ywarn-numeric-widen</arg>          <!-- Warn when numerics are widened. -->
            <arg>-Ywarn-unused:imports</arg>         <!-- Warn if an import selector is not referenced. -->
            <arg>-Ywarn-unused:locals</arg>          <!-- Warn if a local definition is unused. -->
            <arg>-Ywarn-unused:privates</arg>        <!-- Warn if a private member is unused. -->
            <arg>-Ywarn-unused:implicits</arg>       <!-- Warn if an implicit parameter is unused. -->
            <arg>-Ywarn-unused:privates</arg>        <!-- Warn if a private member is unused. -->
            <arg>-Ybackend-parallelism</arg><arg>8</arg>         <!-- Enable parallelization — change to desired number! -->
            <arg>-Ycache-plugin-class-loader:last-modified</arg> <!-- Enables caching of classloaders for compiler plugins -->
            <arg>-Ycache-macro-class-loader:last-modified</arg>  <!-- and macro definitions. This can lead to performance improvements. -->

            <!-- these warnings is no an actual issue, our smart constructor usage is fine with a scala 3 compiler-->
            <arg>-Wconf:msg=constructor modifiers are assumed by synthetic:s</arg>
            <arg>-Wconf:msg=access modifiers for .* method are copied from the case class constructor under Scala 3:s</arg>
          </args>
          <jvmArgs>
            <jvmArg>-Xmx${jvmArg-Xmx}</jvmArg>
            <jvmArg>-Xms${jvmArg-Xmx}</jvmArg>
            <jvmArg>-Xss${jvmArg-Xss}</jvmArg>
            <jvmArg>${jvmArg-arg0}</jvmArg>
            <jvmArg>${jvmArg-arg1}</jvmArg>
            <jvmArg>${jvmArg-arg2}</jvmArg>
            <jvmArg>${jvmArg-arg3}</jvmArg>
            <jvmArg>${jvmArg-arg4}</jvmArg>
            <jvmArg>${jvmArg-arg5}</jvmArg>
            <jvmArg>${jvmArg-arg6}</jvmArg>
            <jvmArg>${jvmArg-arg7}</jvmArg>
            <jvmArg>${jvmArg-arg8}</jvmArg>
            <jvmArg>${jvmArg-arg9}</jvmArg>
          </jvmArgs>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.zeroturnaround</groupId>
        <artifactId>jrebel-maven-plugin</artifactId>
        <version>1.1.10</version>
        <executions>
          <execution>
            <id>generate-rebel-xml</id>
            <phase>process-resources</phase>
            <goals>
              <goal>generate</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.10.1</version>
        <configuration>
          <release>17</release>
        </configuration>
        <executions>
          <execution>
            <phase>compile</phase>
            <goals>
              <goal>compile</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-source-plugin</artifactId>
        <version>3.2.1</version>
        <executions>
          <execution>
            <id>attach-sources</id>
            <phase>verify</phase>
            <goals>
              <goal>jar-no-fork</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <!-- formatting with scalafmt -->
      <plugin>
        <groupId>com.diffplug.spotless</groupId>
        <artifactId>spotless-maven-plugin</artifactId>
        <version>2.27.2</version>
        <configuration>
          <scala>
            <includes>
              <include>src/**/*.scala</include>
            </includes>
            <excludes>
              <exclude>**/ConstraintsTest.scala</exclude> <!-- make spotless scalafmt stack overflow, works on intellij: ignore -->
            </excludes>

            <scalafmt>
              <version>3.7.17</version>
              <file>.scalafmt.conf</file>
            </scalafmt>

<!--            <licenseHeader>-->
<!--              <content>/* (C)$YEAR */</content>  &lt;!&ndash; or <file>${project.basedir}/license-header</file> &ndash;&gt;-->
<!--              <delimiter>package </delimiter> &lt;!&ndash;-->
<!--                note the 'package ' argument - this is a regex which identifies the top-->
<!--                of the file, be careful that all of your sources have a package declaration,-->
<!--                or pick a regex which works better for your code &ndash;&gt;-->
<!--            </licenseHeader>-->
          </scala>
        </configuration>
        <executions>
          <execution>
            <goals>
              <goal>check</goal>
            </goals>
            <phase>verify</phase> <!-- verify: default value -->
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.12.4</version>
        <configuration>
          <argLine>-Dspecs2.commandline=console</argLine>
        </configuration>
      </plugin>
    </plugins>
    <pluginManagement>
    <plugins>
      <!-- configure jar everywhere -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.3.0</version>
        <configuration>
          <archive>
            <addMavenDescriptor>false</addMavenDescriptor>
            <manifestEntries>
              <!-- let built-by be empty - we can't remove it -->
              <Built-By>${project.organization.name}</Built-By>
              <Build-Time>${maven.build.timestamp}</Build-Time>
              <version>${project.version}</version>
            </manifestEntries>
          </archive>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.3.2</version>
        <configuration>
          <archive>
            <addMavenDescriptor>false</addMavenDescriptor>
            <manifestEntries>
              <!-- let built-by be empty - we can't remove it -->
              <Built-By>${project.organization.name}</Built-By>
              <!-- And yes, manifest file must start with upper case... -->
              <Build-Time>${maven.build.timestamp}</Build-Time>
              <Version>${project.version}</Version>
            </manifestEntries>
          </archive>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.eclipse.m2e</groupId>
        <artifactId>lifecycle-mapping</artifactId>
        <version>1.0.0</version>
        <configuration>
          <lifecycleMappingMetadata>
            <pluginExecutions>
              <pluginExecution>
                <pluginExecutionFilter>
                  <groupId>org.zeroturnaround</groupId>
                  <artifactId>jrebel-maven-plugin</artifactId>
                  <versionRange>[0.1,)</versionRange>
                  <goals>
                    <goal>generate</goal>
                  </goals>
                </pluginExecutionFilter>
                <action>
                  <execute/>
                </action>
              </pluginExecution>
              <pluginExecution>
                <pluginExecutionFilter>
                  <groupId>net.alchim31.maven</groupId>
                  <artifactId>scala-maven-plugin</artifactId>
                  <versionRange>[0.1,)</versionRange>
                  <goals>
                    <goal>add-source</goal>
                    <goal>compile</goal>
                    <goal>testCompile</goal>
                  </goals>
                </pluginExecutionFilter>
                <action>
                  <configurator>
                    <id>org.maven.ide.eclipse.scala</id>
                  </configurator>
                </action>
              </pluginExecution>
            </pluginExecutions>
          </lifecycleMappingMetadata>
        </configuration>
      </plugin>
    </plugins>
    </pluginManagement>
  </build>

  <!-- ====================================  /PROJECT BUILD  ==================================== -->

  <!-- ==================================== PROJECT PROPERTIES  ==================================== -->

  <properties>
    <!-- we use UTF-8 for everything -->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

    <!-- Maven plugin version -->
    <scala-maven-plugin-version>4.7.2</scala-maven-plugin-version>

    <!-- Libraries version that MUST be used in all children project -->

    <current-year>2025</current-year>
    <rudder-major-version>8.3</rudder-major-version>
    <rudder-version>8.3.4</rudder-version>

    <servlet-version>5.0.0</servlet-version>
    <scala-version>2.13.16</scala-version>
    <scala-binary-version>2.13</scala-binary-version>
    <!-- lift force us to remain with 1.3.0 because of
         java.lang.NoSuchMethodError: 'scala.collection.mutable.Stack scala.xml.parsing.NoBindingFactoryAdapter.scopeStack()'net.liftweb.util.Html5Parser.$anonfun$parse$1(HtmlParser.scala:373)
          And scala-xml 2.1.0 has non-trivial change on parsing semantic, can't
         upgrade without much care and correcting how we parse XML doc (xml
         parser option - see https://github.com/scala/scala-xml/releases/tag/v2.1.0 -->
    <scala-xml-version>1.3.0</scala-xml-version>
    <lift-version>4.0.0-M1</lift-version>
    <slf4j-version>2.0.16</slf4j-version>
    <logback-version>1.5.17</logback-version>
    <janino-version>3.1.12</janino-version>
    <jodatime-version>2.13.0</jodatime-version>
    <jodaconvert-version>3.0.1</jodaconvert-version>
    <commons-io-version>2.19.0</commons-io-version>
    <commons-lang-version>3.17.0</commons-lang-version>
    <commons-text-version>1.13.0</commons-text-version>
    <commons-codec-version>1.18.0</commons-codec-version>
    <commons-fileupload>2.0.0-M4</commons-fileupload>
    <commons-csv-version>1.12.0</commons-csv-version>
    <jgit-version>7.0.1.202505221510-r</jgit-version>
    <spring-version>6.1.21</spring-version>
    <spring-security-version>6.3.8</spring-security-version>
    <cglib-version>3.3.0</cglib-version>
    <asm-version>9.7.1</asm-version>
    <!-- Level of Java compatibility, here 1.8+ -->
    <bouncycastle-compat>jdk18on</bouncycastle-compat>
    <bouncycastle-version>1.80</bouncycastle-version>
    <better-files-version>3.9.2</better-files-version>
    <sourcecode-version>0.4.2</sourcecode-version>
    <quicklens-version>1.9.12</quicklens-version>
    <hikaricp-version>6.2.1</hikaricp-version>
    <nuprocess-version>3.0.0</nuprocess-version>
    <postgresql-version>42.7.7</postgresql-version>
    <json-path-version>2.9.0</json-path-version>
    <json-smart-version>2.5.2</json-smart-version>
    <scalaj-version>2.4.2</scalaj-version>
    <unboundid-version>7.0.2</unboundid-version>
    <fastparse-version>3.1.1</fastparse-version>
    <config-version>1.4.3</config-version>
    <caffeine-version>3.1.8</caffeine-version>
    <jgrapht-version>1.5.2</jgrapht-version>
    <reflections-version>0.10.2</reflections-version>
    <graalvm-version>24.1.2</graalvm-version>
    <chimney-version>1.7.3</chimney-version>
    <cron4s-version>0.8.2</cron4s-version>
    <ipaddress-version>5.5.1</ipaddress-version>
    <snakeyaml-version>2.3</snakeyaml-version>

    <zio-http-version>2.0.0-RC11</zio-http-version> <!-- used in datasources -->

    <!--
      These one must be updated to work together
      We declare cats in "test" here, because it is not directly needed
      in any project before rudder.
    -->
    <specs2-version>4.20.9</specs2-version>
    <junit-version>4.13.2</junit-version>
    <cats-version>2.12.0</cats-version>
    <ip4s-version>3.6.0</ip4s-version>
    <doobie-version>1.0.0-RC5</doobie-version>
    <fs2-version>3.10.2</fs2-version>
    <cats-effect-version>3.5.5</cats-effect-version>
    <dev-zio-version>2.1.19</dev-zio-version>
    <zio-cats-version>23.1.0.3</zio-cats-version> <!-- gives fs2 3.10.2, but doobie 1.0.0-RC5 is in 3.9.3 -->
    <zio-json-version>0.7.43</zio-json-version>
    <enumeratum-version>1.7.5</enumeratum-version>

    <!--
      Hack to make scalac jvm parameters like RAM configurable.
      With that, one can override Xmx or add jvm parameters either
      in command line invocation: mvn compile -DjvmArg-Xmx="4G"
      or in ~/.m2/settings.xml with profiles.
    -->

    <jvmArg-Xmx>2G</jvmArg-Xmx>
    <jvmArg-Xss>64m</jvmArg-Xss>
    <jvmArg-arg0/>
    <jvmArg-arg1/>
    <jvmArg-arg2/>
    <jvmArg-arg3/>
    <jvmArg-arg4/>
    <jvmArg-arg5/>
    <jvmArg-arg6/>
    <jvmArg-arg7/>
    <jvmArg-arg8/>
    <jvmArg-arg9/>

  </properties>

  <!-- ==================================== PROJECT DEPENDENCIES  ==================================== -->

  <!--
    This allows to use homogeneous version of scalaz everywhere.
    Yep, we need to explicitly specify them all.
  -->
  <dependencyManagement>
    <dependencies>
      <!--
        We need to enforce version of all components of scala, else maven takes the oldest from transitive dep.
        It seems to be because scala has them "compatible"
       -->
      <dependency>
        <groupId>jakarta.servlet</groupId>
        <artifactId>jakarta.servlet-api</artifactId>
        <version>${servlet-version}</version>
        <scope>provided</scope>
      </dependency>
      <dependency>
        <groupId>org.scala-lang</groupId>
        <artifactId>scala-library</artifactId>
        <version>${scala-version}</version>
      </dependency>
      <dependency>
        <groupId>org.scala-lang</groupId>
        <artifactId>scala-compiler</artifactId>
        <version>${scala-version}</version>
      </dependency>
      <dependency>
        <groupId>org.scala-lang</groupId>
        <artifactId>scala-reflect</artifactId>
        <version>${scala-version}</version>
      </dependency>
      <dependency>
        <groupId>org.scala-lang</groupId>
        <artifactId>scalap</artifactId>
        <version>${scala-version}</version>
      </dependency>
      <dependency>
        <groupId>org.scala-lang.modules</groupId>
        <artifactId>scala-xml_${scala-binary-version}</artifactId>
        <version>${scala-xml-version}</version>
      </dependency>
      <dependency>
        <groupId>org.typelevel</groupId>
        <artifactId>cats-core_${scala-binary-version}</artifactId>
        <version>${cats-version}</version>
      </dependency>
      <dependency>
        <groupId>com.comcast</groupId>
        <artifactId>ip4s-core_${scala-binary-version}</artifactId>
        <version>${ip4s-version}</version>
      </dependency>
      <dependency>
        <groupId>org.tpolecat</groupId>
        <artifactId>doobie-core_${scala-binary-version}</artifactId>
        <version>${doobie-version}</version>
      </dependency>
      <dependency>
        <groupId>com.lihaoyi</groupId>
        <artifactId>sourcecode_${scala-binary-version}</artifactId>
        <version>${sourcecode-version}</version>
      </dependency>
      <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP</artifactId>
        <version>${hikaricp-version}</version>
      </dependency>
      <dependency>
        <groupId>org.postgresql</groupId>
	      <artifactId>postgresql</artifactId>
        <version>${postgresql-version}</version>
      </dependency>
      <dependency>
        <groupId>com.softwaremill.quicklens</groupId>
        <artifactId>quicklens_${scala-binary-version}</artifactId>
        <version>${quicklens-version}</version>
      </dependency><!--
        lift-web
      -->
      <dependency>
        <groupId>xerces</groupId>
        <artifactId>xercesImpl</artifactId>
        <version>2.12.2</version>
      </dependency>
      <dependency>
        <groupId>net.liftweb</groupId>
        <artifactId>lift-common_${scala-binary-version}</artifactId>
        <version>${lift-version}</version>
        <exclusions>
          <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
          </exclusion>
          <exclusion>
            <artifactId>log4j</artifactId>
            <groupId>log4j</groupId>
          </exclusion>
        </exclusions>
      </dependency>
      <dependency>
        <groupId>net.liftweb</groupId>
        <artifactId>lift-json_${scala-binary-version}</artifactId>
        <version>${lift-version}</version>
      </dependency>
      <dependency>
        <groupId>net.liftweb</groupId>
        <artifactId>lift-util_${scala-binary-version}</artifactId>
        <version>${lift-version}</version>
        <exclusions>
          <exclusion>
            <artifactId>mail</artifactId>
            <groupId>javax.mail</groupId>
          </exclusion>
        </exclusions>
      </dependency>
      <dependency>
        <groupId>net.liftweb</groupId>
        <artifactId>lift-webkit_${scala-binary-version}</artifactId>
        <version>${lift-version}</version>
        <exclusions>
          <exclusion>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
	  </exclusion>
	  <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <!-- joda time -->
      <dependency>
        <groupId>joda-time</groupId>
        <artifactId>joda-time</artifactId>
        <version>${jodatime-version}</version>
      </dependency>
      <dependency>
        <groupId>org.joda</groupId>
        <artifactId>joda-convert</artifactId>
        <version>${jodaconvert-version}</version>
      </dependency>
      <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcprov-${bouncycastle-compat}</artifactId>
        <version>${bouncycastle-version}</version>
      </dependency>
      <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcpkix-${bouncycastle-compat}</artifactId>
        <version>${bouncycastle-version}</version>
      </dependency>
      <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcpg-${bouncycastle-compat}</artifactId>
        <version>${bouncycastle-version}</version>
      </dependency>
      <dependency>
        <groupId>com.github.alonsodomin.cron4s</groupId>
        <artifactId>cron4s-core_${scala-binary-version}</artifactId>
        <version>${cron4s-version}</version>
      </dependency>

      <dependency>
        <groupId>com.lihaoyi</groupId>
        <artifactId>fastparse_${scala-binary-version}</artifactId>
        <version>${fastparse-version}</version>
      </dependency>

      <!-- commons -->
      <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>${commons-io-version}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>${commons-lang-version}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-text</artifactId>
        <version>${commons-text-version}</version>
      </dependency>
      <dependency>
        <groupId>commons-codec</groupId>
        <artifactId>commons-codec</artifactId>
        <version>${commons-codec-version}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-csv</artifactId>
        <version>${commons-csv-version}</version>
      </dependency>
      <!-- spring -->
      <dependency>
        <groupId>org.ow2.asm</groupId>
        <artifactId>asm</artifactId>
        <version>${asm-version}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring-version}</version>
        <exclusions>
          <exclusion>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring-version}</version>
        <exclusions>
          <exclusion>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <!-- need to be specified else spring-security version is used -->
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>${spring-version}</version>
        <exclusions>
          <exclusion>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>${spring-version}</version>
        <exclusions>
          <exclusion>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-expression</artifactId>
        <version>${spring-version}</version>
        <exclusions>
          <exclusion>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <!-- Needed to use spring configuration by annotation -->
      <dependency>
        <groupId>cglib</groupId>
        <artifactId>cglib</artifactId>
        <version>${cglib-version}</version>
        <exclusions>
          <exclusion>
            <groupId>org.apache.ant</groupId>
            <artifactId>ant</artifactId>
          </exclusion>
        </exclusions>
      </dependency>

      <!--  test -->
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>${junit-version}</version>
      </dependency>
      <dependency>
        <groupId>org.specs2</groupId>
        <artifactId>specs2-core_${scala-binary-version}</artifactId>
        <version>${specs2-version}</version>
      </dependency>
      <dependency>
        <groupId>org.specs2</groupId>
        <artifactId>specs2-matcher-extra_${scala-binary-version}</artifactId>
        <version>${specs2-version}</version>
      </dependency>
      <dependency>
        <groupId>org.specs2</groupId>
        <artifactId>specs2-junit_${scala-binary-version}</artifactId>
        <version>${specs2-version}</version>
      </dependency>
      <dependency>
        <groupId>org.tpolecat</groupId>
        <artifactId>doobie-specs2_${scala-binary-version}</artifactId>
        <version>${doobie-version}</version>
      </dependency>
      <!-- No httpclient / commons-logging for jgit -->
      <dependency>
        <groupId>org.eclipse.jgit</groupId>
        <artifactId>org.eclipse.jgit</artifactId>
        <version>${jgit-version}</version>
        <exclusions>
          <exclusion>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <!-- the slf4j commons-logging replacement -->
      <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${slf4j-version}</version>
      </dependency>
      <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>
        <version>${slf4j-version}</version>
      </dependency>
      <!-- using slf4j native backend -->
      <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
        <version>${logback-version}</version>
      </dependency>
      <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>${logback-version}</version>
      </dependency>
      <dependency>
        <groupId>org.codehaus.janino</groupId>
        <artifactId>janino</artifactId>
        <version>${janino-version}</version>
      </dependency>
      <dependency>
        <groupId>com.github.pathikrit</groupId>
        <artifactId>better-files_${scala-binary-version}</artifactId>
        <version>${better-files-version}</version>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <dependencies>
    <!-- almost used in all projects -->
    <dependency>
      <groupId>com.github.pathikrit</groupId>
      <artifactId>better-files_${scala-binary-version}</artifactId>
      <version>${better-files-version}</version>
    </dependency>
    <dependency>
      <groupId>com.beachape</groupId>
      <artifactId>enumeratum_${scala-binary-version}</artifactId>
      <version>${enumeratum-version}</version>
    </dependency>
    <!-- joda-time is used in all projects -->
    <dependency>
      <groupId>joda-time</groupId>
      <artifactId>joda-time</artifactId>
      <version>${jodatime-version}</version>
    </dependency>
    <!-- standard utility to deep modify immutable structures -->
    <dependency>
      <groupId>com.softwaremill.quicklens</groupId>
      <artifactId>quicklens_${scala-binary-version}</artifactId>
      <version>${quicklens-version}</version>
    </dependency>
    <!-- this is now standard -->
    <dependency>
      <groupId>org.typelevel</groupId>
      <artifactId>cats-core_${scala-binary-version}</artifactId>
      <version>${cats-version}</version>
    </dependency>
    <!-- zio to manage effects -->
    <dependency>
      <groupId>dev.zio</groupId>
      <artifactId>zio_${scala-binary-version}</artifactId>
      <version>${dev-zio-version}</version>
    </dependency>
    <dependency>
      <groupId>dev.zio</groupId>
      <artifactId>zio-stacktracer_${scala-binary-version}</artifactId>
      <version>${dev-zio-version}</version>
    </dependency>
    <dependency>
      <groupId>dev.zio</groupId>
      <artifactId>zio-concurrent_${scala-binary-version}</artifactId>
      <version>${dev-zio-version}</version>
    </dependency>
    <dependency>
      <groupId>dev.zio</groupId>
      <artifactId>zio-streams_${scala-binary-version}</artifactId>
      <version>${dev-zio-version}</version>
    </dependency>
    <dependency>
      <groupId>dev.zio</groupId>
      <artifactId>zio-json_${scala-binary-version}</artifactId>
      <version>${zio-json-version}</version>
    </dependency>
    <dependency>
      <groupId>dev.zio</groupId>
      <artifactId>zio-json-yaml_${scala-binary-version}</artifactId>
      <version>${zio-json-version}</version>
    </dependency>
    <!-- explicit snakeyaml dependency to override default zio-json-version -->
    <dependency>
      <groupId>org.yaml</groupId>
      <artifactId>snakeyaml</artifactId>
      <version>${snakeyaml-version}</version>
    </dependency>
    <dependency>
      <groupId>io.scalaland</groupId>
      <artifactId>chimney_${scala-binary-version}</artifactId>
      <version>${chimney-version}</version>
    </dependency>
    <dependency>
      <groupId>io.scalaland</groupId>
      <artifactId>chimney-cats_${scala-binary-version}</artifactId>
      <version>${chimney-version}</version>
    </dependency>
    <!-- zio/cats compat -->
    <dependency>
      <groupId>dev.zio</groupId>
      <artifactId>zio-interop-cats_${scala-binary-version}</artifactId>
      <version>${zio-cats-version}</version>
    </dependency>
    <dependency>
      <groupId>org.typelevel</groupId>
      <artifactId>cats-effect_${scala-binary-version}</artifactId>
      <version>${cats-effect-version}</version>
    </dependency>
    <!-- graph library for group properties -->
    <dependency>
      <groupId>org.jgrapht</groupId>
      <artifactId>jgrapht-core</artifactId>
      <version>${jgrapht-version}</version>
    </dependency>

    <!--  test -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>${junit-version}</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.specs2</groupId>
      <artifactId>specs2-core_${scala-binary-version}</artifactId>
      <version>${specs2-version}</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.specs2</groupId>
      <artifactId>specs2-matcher-extra_${scala-binary-version}</artifactId>
      <version>${specs2-version}</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.specs2</groupId>
      <artifactId>specs2-junit_${scala-binary-version}</artifactId>
      <version>${specs2-version}</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.tpolecat</groupId>
      <artifactId>doobie-specs2_${scala-binary-version}</artifactId>
      <version>${doobie-version}</version>
      <scope>test</scope>
    </dependency>
    <!-- zio tests -->
    <dependency>
      <groupId>dev.zio</groupId>
      <artifactId>zio-test_${scala-binary-version}</artifactId>
      <version>${dev-zio-version}</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>dev.zio</groupId>
      <artifactId>zio-test-junit_${scala-binary-version}</artifactId>
      <version>${dev-zio-version}</version>
      <scope>test</scope>
    </dependency>

    <!--
        included to use slf4j native backend
        If you want to use another backend,
        exclude these dependencies from parent
    -->
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-core</artifactId>
      <version>${logback-version}</version>
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>${logback-version}</version>
    </dependency>
    <dependency>
      <groupId>org.codehaus.janino</groupId>
      <artifactId>janino</artifactId>
      <version>${janino-version}</version>
    </dependency>
  </dependencies>

</project>
