<?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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <!-- NOTE: Deliberately not using parent pom and separate groupId/artifactId
    
    This module should not be built as part of a release.  
    -->
    <name>Commons RDF: Examples</name>
    
    <groupId>com.example</groupId> <!--  Change to your groupId -->
    <artifactId>commons-rdf-examples</artifactId> <!-- Change to your artifactId -->
    <version>0.1</version>

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <commons.rdf.version>0.5.0</commons.rdf.version> <!-- update to latest version -->
    </properties>

    <build>
      <!-- simplify folder structure for this example -
           real projects should use regular
           src/main/java
           src/test/java
      -->
      <testSourceDirectory>src</testSourceDirectory>
      <sourceDirectory>src-2</sourceDirectory> <!-- not used -->
    </build>

    <distributionManagement>
      <site>
        <id>commonsrdf-api-site</id>
        <url>scm:svn:${commons.scmPubUrl}/examples/</url>
      </site>
    </distributionManagement>

    <dependencies>
    	<dependency>
    		<groupId>org.apache.commons</groupId>
    		<artifactId>commons-rdf-api</artifactId>
    		<version>${commons.rdf.version}</version>
    	</dependency>
    	<dependency>
    		<groupId>org.apache.commons</groupId>
    		<artifactId>commons-rdf-simple</artifactId>
    		<version>${commons.rdf.version}</version>
    	</dependency>
    	<dependency>
    		<groupId>junit</groupId>
    		<artifactId>junit</artifactId>
    		<version>4.12</version>
    		<scope>test</scope>
    	</dependency>
    </dependencies>

    <repositories>
        <!-- Only needed if testing  release of commons-rdf -->
    	<repository>
    		<id>apache.snapshots</id>
    		<name>Apache Snapshot Repository</name>
    		<url>http://repository.apache.org/snapshots</url>
    		<releases>
    			<enabled>false</enabled>
    		</releases>
    	</repository>
    </repositories>

</project>
