<?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>1.5.0-SNAPSHOT</version>
   </parent>

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

   <properties>
      <activemq5-version>5.12.0</activemq5-version>
      <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>
      </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>
      </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>
