<!--
  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">
  <parent>
    <groupId>org.apache.felix</groupId>
    <artifactId>felix-parent</artifactId>
    <version>2.1</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>
  <packaging>bundle</packaging>
  <name>Junit4Osgi-Swing-GUI</name>
  <artifactId>org.apache.felix.ipojo.junit4osgi.swing-gui</artifactId>
  <version>1.1.0-SNAPSHOT</version>
  <dependencies>
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>org.apache.felix.ipojo.junit4osgi</artifactId>
      <version>1.1.0-SNAPSHOT</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
    </dependency>
  </dependencies>
  <build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <configuration>
        <source>1.5</source>
        <target>1.5</target>
      </configuration>
    </plugin>
    <plugin>
      <groupId>org.apache.felix</groupId>
      <artifactId>maven-bundle-plugin</artifactId>
      <version>2.3.5</version>
      <extensions>true</extensions>
      <configuration>
        <instructions>
          <Bundle-Name>Apache Felix iPOJO OSGi Junit Runner - Swing Gui</Bundle-Name>
          <Bundle-SymbolicName> ${project.artifactId}</Bundle-SymbolicName>
          <Private-Package> org.apache.felix.ipojo.junit4osgi.command
          </Private-Package>
          <Import-Package>org.osgi.framework;version=1.3,*
          </Import-Package>
          <_plugin>org.apache.felix.ipojo.bnd.PojoizationPlugin;metadata=${basedir}/metadata.xml;use-local-schemas=true</_plugin>
        </instructions>
      </configuration>
      <dependencies>
        <dependency>
          <groupId>org.apache.felix</groupId>
          <artifactId>bnd-ipojo-plugin</artifactId>
          <version>1.0.0-SNAPSHOT</version>
        </dependency>
      </dependencies>
    </plugin>
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>rat-maven-plugin</artifactId>
      <configuration>
        <excludeSubProjects>false</excludeSubProjects>
        <useEclipseDefaultExcludes>true</useEclipseDefaultExcludes>
        <useMavenDefaultExcludes>true</useMavenDefaultExcludes>
        <excludes>
          <param>doc/*</param>
          <param>maven-eclipse.xml</param>
          <param>.checkstyle</param>
          <param>.externalToolBuilders/*</param>
        </excludes>
      </configuration>
    </plugin>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-checkstyle-plugin
      </artifactId>
      <configuration>
        <configLocation>
          http://felix.apache.org/ipojo/dev/checkstyle_ipojo.xml
        </configLocation>
        <violationSeverity>error</violationSeverity>
      </configuration>
    </plugin>
  </plugins>
</build>
</project>
