<!--
  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:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
         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>

    <parent>
        <groupId>org.sonatype.oss</groupId>
        <artifactId>oss-parent</artifactId>
        <version>7</version>
    </parent>
    <properties>
        <maven_javadoc_version>3.0.1</maven_javadoc_version>
        <maven_surefire_version>2.19.1</maven_surefire_version>
    </properties>
    <groupId>com.alibaba.boot</groupId>
    <artifactId>dubbo-spring-boot-project</artifactId>
    <version>0.2.0</version>

    <packaging>pom</packaging>

    <name>Dubbo Spring Boot Project</name>
    <description>Dubbo Spring Boot Project</description>
    <url>https://github.com/apache/incubator-dubbo-spring-boot-project</url>

    <modules>
        <module>dubbo-spring-boot-parent</module>
        <module>dubbo-spring-boot-autoconfigure</module>
        <module>dubbo-spring-boot-starter</module>
        <module>dubbo-spring-boot-samples</module>
        <module>dubbo-spring-boot-actuator</module>
    </modules>

    <organization>
        <name>The Apache Software Foundation</name>
        <url>http://www.apache.org/</url>
    </organization>

    <scm>
        <url>https://github.com/apache/incubator-dubbo-spring-boot-project</url>
        <connection>scm:git:git:////github.com/apache/incubator-dubbo-spring-boot-project.git</connection>
        <developerConnection>scm:git:ssh://git@//github.com/apache/incubator-dubbo-spring-boot-project.git
        </developerConnection>
    </scm>

    <issueManagement>
        <system>Github</system>
        <url>https://github.com/apache/incubator-dubbo-spring-boot-project/issues</url>
    </issueManagement>

    <mailingLists>
        <mailingList>
            <name>Development List</name>
            <subscribe>dev-subscribe@dubbo.apache.org</subscribe>
            <unsubscribe>dev-unsubscribe@dubbo.apache.org</unsubscribe>
            <post>dev@dubbo.apache.org</post>
        </mailingList>
        <mailingList>
            <name>Commits List</name>
            <subscribe>commits-subscribe@dubbo.apache.org</subscribe>
            <unsubscribe>commits-unsubscribe@dubbo.apache.org</unsubscribe>
            <post>commits@dubbo.apache.org</post>
        </mailingList>
        <mailingList>
            <name>Issues List</name>
            <subscribe>issues-subscribe@dubbo.apache.org</subscribe>
            <unsubscribe>issues-unsubscribe@dubbo.apache.org</unsubscribe>
            <post>issues@dubbo.apache.org</post>
        </mailingList>
    </mailingLists>
    <developers>
        <developer>
            <id>Apache Dubbo (incubating)</id>
            <name>The Apache Dubbo (incubating) Project Contributors</name>
            <email>dev@dubbo.apache.org</email>
            <url>http://dubbo.apache.org</url>
        </developer>
    </developers>

    <profiles>
        <profile>
            <id>release</id>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-javadoc-plugin</artifactId>
                        <version>${maven_javadoc_version}</version>
                        <executions>
                            <execution>
                                <phase>package</phase>
                                <goals>
                                    <goal>jar</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-gpg-plugin</artifactId>
                        <executions>
                            <execution>
                                <phase>verify</phase>
                                <goals>
                                    <goal>sign</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>

    <build>
        <plugins>
            <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>
        </plugins>
    </build>

</project>