<!--
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>9.0.3</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.10_0.14.2</version>
      </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>compile</phase>
            <goals>
              <goal>add-source</goal>
              <goal>compile</goal>
            </goals>
          </execution>
          <execution>
            <id>scala-test-compile</id>
            <phase>test-compile</phase>
            <goals>
              <goal>testCompile</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <scalaCompatVersion>${scala-binary-version}</scalaCompatVersion>
          <scalaVersion>${scala-version}</scalaVersion>
          <recompileMode>all</recompileMode>
          <args>
            <arg>-release:17</arg>
            <arg>-deprecation</arg>                  <!-- Emit warning and location for usages of deprecated APIs. -->
            <arg>-explain-types</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>-Xmax-inlines</arg><arg>100</arg>
            <!-- Ignore warning for BoxTrait existential type, no way to change that -->
            <arg>-Wconf:msg=An existential type that came from a Scala-2 classfile for trait BoxTrait:s</arg>
            <!--<arg>-Wsafe-init</arg> -->      <!--  Wrap field accessors to throw an exception on uninitialized access. Disabled because of technique repo and API -->
            <arg>-Xfatal-warnings</arg>         <!-- Fail the compilation if there are any warnings. -->
            <arg>-Wunused:imports</arg>         <!-- Warn if an import selector is not referenced. -->
            <arg>-Wunused:locals</arg>          <!-- Warn if a local definition is unused. -->
            <arg>-Wunused:implicits</arg>       <!-- Warn if an implicit parameter is unused. -->
            <arg>-Wunused:privates</arg>        <!-- Warn if a private member is unused. -->
            <arg>-Ysemanticdb</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.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.13.0</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.3.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.43.0</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>validate</phase>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>3.5.1</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> <!-- 3.4.x does not work -->
        <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.4.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>
              <!-- 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.8.1</scala-maven-plugin-version>

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

    <current-year>2025</current-year>
    <rudder-major-version>9.0</rudder-major-version>
    <rudder-version>9.0.3</rudder-version>

    <servlet-version>5.0.0</servlet-version>
    <scala-version>3.7.2</scala-version>
    <scala2-version>2.13.16</scala2-version>
    <scala-binary-version>3</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.17</slf4j-version>
    <logback-version>1.5.18</logback-version>
    <janino-version>3.1.12</janino-version>
    <jodatime-version>2.14.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.1</commons-text-version>
    <commons-codec-version>1.18.0</commons-codec-version>
    <commons-fileupload>2.0.0-M4</commons-fileupload>
    <commons-csv-version>1.14.0</commons-csv-version>
    <jgit-version>7.2.1.202505142326-r</jgit-version>
    <spring-version>6.1.21</spring-version>
    <spring-security-version>6.3.9</spring-security-version>
    <cglib-version>3.3.0</cglib-version>
    <asm-version>9.8</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.3.0</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.2.0</caffeine-version>
    <jgrapht-version>1.5.2</jgrapht-version>
    <reflections-version>0.10.2</reflections-version>
    <graalvm-version>24.2.1</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.4</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.21.0</specs2-version>
    <junit-version>4.13.2</junit-version>
    <cats-version>2.13.0</cats-version>
    <ip4s-version>3.7.0</ip4s-version>
    <doobie-version>1.0.0-RC9</doobie-version>
    <fs2-version>3.10.2</fs2-version>
    <cats-effect-version>3.6.1</cats-effect-version>
    <dev-zio-version>2.1.19</dev-zio-version>
    <zio-cats-version>23.1.0.5</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>
    <izumi-version>3.0.5</izumi-version>
    <magnolia-version>1.3.18</magnolia-version>
    <difflicious-version>0.4.3</difflicious-version>
    <enumeratum-version>1.7.6</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>${scala2-version}</version>
      </dependency>
      <dependency>
        <groupId>org.scala-lang</groupId>
        <artifactId>scala3-library_${scala-binary-version}</artifactId>
        <version>${scala-version}</version>
      </dependency>
      <dependency>
        <groupId>org.scala-lang</groupId>
        <artifactId>scala-compiler_${scala-binary-version}</artifactId>
        <version>${scala-version}</version>
      </dependency>
      <dependency>
        <groupId>org.scala-lang.modules</groupId>
        <artifactId>scala-parser-combinators_3</artifactId>
        <version>2.3.0</version>
      </dependency>
      <dependency>
        <groupId>org.scala-lang</groupId>
        <artifactId>scala-reflect_${scala-binary-version}</artifactId>
        <version>${scala-version}</version>
      </dependency>
      <dependency>
        <groupId>org.scala-lang.modules</groupId>
        <artifactId>scala-xml_2.13</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>
      <!-- this is needed for doobie/cats/zio compat in scala 3 -->
      <dependency>
        <groupId>org.typelevel</groupId>
        <artifactId>cats-effect-std_${scala-binary-version}</artifactId>
        <version>${cats-effect-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_2.13</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_2.13</artifactId>
        <version>${lift-version}</version>
      </dependency>
      <dependency>
        <groupId>net.liftweb</groupId>
        <artifactId>lift-util_2.13</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_2.13</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 version needed -->
    <dependency>
      <groupId>dev.zio</groupId>
      <artifactId>izumi-reflect_${scala-binary-version}</artifactId>
      <version>${izumi-version}</version>
    </dependency>
    <!-- use explicit version for magnolia, else conflict in difflicious -->
    <dependency>
      <groupId>com.softwaremill.magnolia1_3</groupId>
      <artifactId>magnolia_${scala-binary-version}</artifactId>
      <version>${magnolia-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>
    <dependency>
      <groupId>com.github.jatcwang</groupId>
      <artifactId>difflicious-core_3</artifactId>
      <version>${difflicious-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>
