<?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">
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-rng-parent</artifactId>
    <version>1.6-SNAPSHOT</version>
  </parent>

  <artifactId>commons-rng-core</artifactId>
  <version>1.6-SNAPSHOT</version>
  <name>Apache Commons RNG Core</name>

  <description>Pure Java implementations of random numbers generator algorithms.
  Code in this module should not be used directly by applications; please use
  the client interface defined in module "commons-rng-client-api" and the factory
  methods defined in module "commons-rng-simple". In a future release, modularization
  may be enforced through JPMS access restrictions.</description>

  <properties>
    <!-- Workaround to avoid duplicating config files. -->
    <rng.parent.dir>${basedir}/..</rng.parent.dir>
    <!-- Reproducible builds -->
    <project.build.outputTimestamp>${rng.build.outputTimestamp}</project.build.outputTimestamp>
    <!-- OSGi -->
    <commons.osgi.symbolicName>org.apache.commons.rng.core</commons.osgi.symbolicName>
    <!-- Export the pacakges required by the simple module -->
    <commons.osgi.export>
        org.apache.commons.rng.core,
        org.apache.commons.rng.core.source32,
        org.apache.commons.rng.core.source64,
        org.apache.commons.rng.core.util
    </commons.osgi.export>
    <!-- Java 9+ -->
    <commons.module.name>org.apache.commons.rng.core</commons.module.name>
    <rng.jira.component>core</rng.jira.component>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-rng-client-api</artifactId>
      <version>1.6-SNAPSHOT</version>
    </dependency>
    <dependency>
      <!-- For testing floating point precision -->
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-math3</artifactId>
      <version>3.6.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
          <rerunFailingTestsCount>2</rerunFailingTestsCount>
        </configuration>
      </plugin>
    </plugins>
  </build>

</project>
