<?xml version='1.0'?>
<!--
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.activemq</groupId>
      <artifactId>artemis-pom</artifactId>
      <version>2.31.2</version>
   </parent>

   <groupId>org.apache.activemq.examples</groupId>
   <artifactId>artemis-examples</artifactId>
   <packaging>pom</packaging>
   <name>ActiveMQ Artemis Examples</name>

   <properties>
      <udp-address>231.7.7.7</udp-address>
      <activemq.basedir>${project.basedir}/..</activemq.basedir>
   </properties>

   <repositories>
      <repository>
          <id>apache.snapshots</id>
          <name>Apache Development Snapshot Repository</name>
          <url>https://repository.apache.org/content/repositories/snapshots/</url>
          <snapshots>
              <enabled>true</enabled>
          </snapshots>
          <releases>
            <enabled>false</enabled>
          </releases>
      </repository>
   </repositories>

   <pluginRepositories>
      <pluginRepository>
         <id>apache.snapshots</id>
         <name>Apache Development Snapshot Repository</name>
         <url>https://repository.apache.org/content/repositories/snapshots/</url>
         <snapshots>
            <enabled>true</enabled>
         </snapshots>
         <releases>
            <enabled>false</enabled>
         </releases>
      </pluginRepository>
   </pluginRepositories>

   <profiles>
      <profile>
         <!-- specify -PnoServer if you don't want to start the servers on the tests -->
         <id>noServer</id>
         <properties>
            <noServer>true</noServer>
         </properties>
      </profile>
      <profile>
         <!-- specify -PnoClient if you don't want to run the client part -->
         <id>noClient</id>
         <properties>
            <noClient>true</noClient>
         </properties>
      </profile>
      <profile>
         <!-- the profile release won't execute anything. just compile and whatever else is needed -->
         <id>release</id>
         <properties>
            <noServer>true</noServer>
            <noClient>true</noClient>
         </properties>
      </profile>
      <profile>
         <!-- the profile release won't execute anything. just compile and whatever else is needed -->
         <id>noRun</id>
         <properties>
            <noServer>true</noServer>
            <noClient>true</noClient>
         </properties>
      </profile>
   </profiles>

   <modules>
      <module>features</module>
      <module>protocols</module>
   </modules>

</project>
