<?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 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.apache.felix.atomos.examples</groupId>
        <artifactId>org.apache.felix.atomos.examples</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>
    <artifactId>org.apache.felix.atomos.examples.jlink</artifactId>
    <name>atomos.examples.jlink</name>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.apache.felix</groupId>
            <artifactId>org.apache.felix.atomos</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.apache.felix.atomos.tests</groupId>
            <artifactId>org.apache.felix.atomos.tests.testbundles.service.contract</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.apache.felix.atomos.tests</groupId>
            <artifactId>org.apache.felix.atomos.tests.testbundles.service.impl</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.apache.felix.atomos.tests</groupId>
            <artifactId>org.apache.felix.atomos.tests.testbundles.service.impl.activator</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.apache.felix</groupId>
            <artifactId>org.apache.felix.scr</artifactId>
        </dependency>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>osgi.promise</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.felix</groupId>
            <artifactId>org.apache.felix.gogo.command</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.felix</groupId>
            <artifactId>org.apache.felix.gogo.runtime</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.felix</groupId>
            <artifactId>org.apache.felix.gogo.shell</artifactId>
            <scope>compile</scope>
        </dependency>
    </dependencies>
    <profiles>
        <profile>
            <id>default-compile</id>
            <dependencies>
                <dependency>
                   <groupId>org.osgi</groupId>
                    <artifactId>osgi.core</artifactId>
                </dependency>
            </dependencies>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <id>equinox</id>
            <dependencies>
                <dependency>
                    <groupId>org.eclipse.platform</groupId>
                    <artifactId>org.eclipse.osgi</artifactId>
                    <scope>provided</scope>
                </dependency>
                <dependency>
                    <groupId>org.apache.felix.atomos</groupId>
                    <artifactId>osgi.core</artifactId>
                    <version>8.0.0-SNAPSHOT</version>
                    <classifier>AtomosEquinox</classifier>
                    <scope>provided</scope>
                </dependency>
            </dependencies>
        </profile>
        <profile>
            <id>felix</id>
            <dependencies>
                <dependency>
                    <groupId>org.apache.felix</groupId>
                    <artifactId>org.apache.felix.framework</artifactId>
                    <scope>provided</scope>
                </dependency>
                <dependency>
                    <groupId>org.apache.felix.atomos</groupId>
                    <artifactId>osgi.core</artifactId>
                    <version>8.0.0-SNAPSHOT</version>
                    <classifier>AtomosFelix</classifier>
                    <scope>provided</scope>
                </dependency>
            </dependencies>
        </profile>
    </profiles>
    <build>
        <plugins>
            <plugin>
                <groupId>org.moditect</groupId>
                <artifactId>moditect-maven-plugin</artifactId>
                <version>1.0.0.RC1</version>
                <executions>
                    <execution>
                        <id>add-module-infos</id>
                        <phase>generate-resources</phase>
                        <goals>
                            <goal>add-module-info</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/modules</outputDirectory>
                            <modules>
                                <module>
                                    <artifact>
                                        <groupId>org.eclipse.platform</groupId>
                                        <artifactId>org.eclipse.osgi</artifactId>
                                    </artifact>
                                    <moduleInfoSource>
                                        open module org.eclipse.osgi {
                                        requires java.xml;

                                        exports org.apache.felix.resolver;
                                        exports org.apache.felix.resolver.util;
                                        exports org.eclipse.core.runtime.adaptor;
                                        exports
                                        org.eclipse.core.runtime.internal.adaptor;
                                        exports org.eclipse.equinox.log;
                                        exports org.eclipse.osgi.container;
                                        exports org.eclipse.osgi.container.builders;
                                        exports org.eclipse.osgi.container.namespaces;
                                        exports
                                        org.eclipse.osgi.framework.console;
                                        exports
                                        org.eclipse.osgi.framework.eventmgr;
                                        exports org.eclipse.osgi.framework.internal.reliablefile;
                                        exports org.eclipse.osgi.framework.log;
                                        exports
                                        org.eclipse.osgi.framework.util;
                                        exports org.eclipse.osgi.internal.cds;
                                        exports
                                        org.eclipse.osgi.internal.container;
                                        exports org.eclipse.osgi.internal.debug;
                                        exports org.eclipse.osgi.internal.framework;
                                        exports
                                        org.eclipse.osgi.internal.framework.legacy;
                                        exports org.eclipse.osgi.internal.hookregistry;
                                        exports
                                        org.eclipse.osgi.internal.hooks;
                                        exports org.eclipse.osgi.internal.loader;
                                        exports
                                        org.eclipse.osgi.internal.loader.buddy;
                                        exports
                                        org.eclipse.osgi.internal.loader.classpath;
                                        exports org.eclipse.osgi.internal.loader.sources;
                                        exports
                                        org.eclipse.osgi.internal.location;
                                        exports
                                        org.eclipse.osgi.internal.messages;
                                        exports
                                        org.eclipse.osgi.internal.permadmin;
                                        exports org.eclipse.osgi.internal.provisional.service.security;
                                        exports
                                        org.eclipse.osgi.internal.provisional.verifier;
                                        exports
                                        org.eclipse.osgi.internal.service.security;
                                        exports
                                        org.eclipse.osgi.internal.serviceregistry;
                                        exports org.eclipse.osgi.internal.signedcontent;
                                        exports
                                        org.eclipse.osgi.internal.url;
                                        exports
                                        org.eclipse.osgi.internal.util;
                                        exports org.eclipse.osgi.internal.weaving;
                                        exports
                                        org.eclipse.osgi.launch;
                                        exports org.eclipse.osgi.report.resolution;
                                        exports
                                        org.eclipse.osgi.service.datalocation;
                                        exports
                                        org.eclipse.osgi.service.debug;
                                        exports org.eclipse.osgi.service.environment;
                                        exports
                                        org.eclipse.osgi.service.localization;
                                        exports org.eclipse.osgi.service.pluginconversion;
                                        exports
                                        org.eclipse.osgi.service.resolver;
                                        exports org.eclipse.osgi.service.runnable;
                                        exports org.eclipse.osgi.service.security;
                                        exports org.eclipse.osgi.service.urlconversion;
                                        exports org.eclipse.osgi.signedcontent;
                                        exports
                                        org.eclipse.osgi.storage;
                                        exports org.eclipse.osgi.storage.bundlefile;
                                        exports org.eclipse.osgi.storage.url;
                                        exports
                                        org.eclipse.osgi.storage.url.bundleentry;
                                        exports
                                        org.eclipse.osgi.storage.url.bundleresource;
                                        exports
                                        org.eclipse.osgi.storage.url.reference;
                                        exports org.eclipse.osgi.storagemanager;
                                        exports org.eclipse.osgi.util;
                                        exports
                                        org.osgi.dto;
                                        exports org.osgi.framework;
                                        exports org.osgi.framework.connect;
                                        exports org.osgi.framework.dto;
                                        exports org.osgi.framework.hooks.bundle;
                                        exports org.osgi.framework.hooks.resolver;
                                        exports
                                        org.osgi.framework.hooks.service;
                                        exports
                                        org.osgi.framework.hooks.weaving;
                                        exports org.osgi.framework.launch;
                                        exports
                                        org.osgi.framework.namespace;
                                        exports org.osgi.framework.startlevel;
                                        exports
                                        org.osgi.framework.startlevel.dto;
                                        exports
                                        org.osgi.framework.wiring;
                                        exports org.osgi.framework.wiring.dto;
                                        exports org.osgi.resource;
                                        exports
                                        org.osgi.resource.dto;
                                        exports org.osgi.service.condpermadmin;
                                        exports
                                        org.osgi.service.log;
                                        exports
                                        org.osgi.service.log.admin;
                                        exports org.osgi.service.packageadmin;
                                        exports org.osgi.service.permissionadmin;
                                        exports
                                        org.osgi.service.resolver;
                                        exports org.osgi.service.startlevel;
                                        exports
                                        org.osgi.service.url;
                                        exports org.osgi.util.tracker;

                                        provides org.osgi.framework.launch.FrameworkFactory with org.eclipse.osgi.launch.EquinoxFactory;
                                        provides
                                        org.osgi.framework.connect.ConnectFrameworkFactory with
                                        org.eclipse.osgi.launch.EquinoxFactory;

                                        uses org.osgi.framework.connect.FrameworkUtilHelper;
                                        }
                                    </moduleInfoSource>
                                </module>
                                <module>
                                    <artifact>
                                        <groupId>org.apache.felix</groupId>
                                        <artifactId>org.apache.felix.framework</artifactId>
                                    </artifact>
                                    <moduleInfoSource>
                                        open module org.apache.felix.framework {
                                        requires jdk.unsupported;

                                        exports org.apache.felix.framework;
                                        exports org.apache.felix.framework.cache;
                                        exports
                                        org.apache.felix.framework.capabilityset;
                                        exports
                                        org.apache.felix.framework.ext;
                                        exports
                                        org.apache.felix.framework.resolver;
                                        exports org.apache.felix.framework.util;
                                        exports
                                        org.apache.felix.framework.util.manifestparser;
                                        exports
                                        org.apache.felix.framework.wiring;
                                        exports org.apache.felix.resolver;
                                        exports
                                        org.apache.felix.resolver.util;

                                        exports org.osgi.dto;
                                        exports org.osgi.framework;
                                        exports org.osgi.framework.connect;
                                        exports
                                        org.osgi.framework.dto;
                                        exports org.osgi.framework.hooks.bundle;
                                        exports
                                        org.osgi.framework.hooks.resolver;
                                        exports org.osgi.framework.hooks.service;
                                        exports
                                        org.osgi.framework.hooks.weaving;
                                        exports
                                        org.osgi.framework.launch;
                                        exports org.osgi.framework.namespace;
                                        exports
                                        org.osgi.framework.startlevel;
                                        exports
                                        org.osgi.framework.startlevel.dto;
                                        exports
                                        org.osgi.framework.wiring;
                                        exports
                                        org.osgi.framework.wiring.dto;
                                        exports org.osgi.resource;
                                        exports org.osgi.resource.dto;
                                        exports
                                        org.osgi.service.packageadmin;
                                        exports
                                        org.osgi.service.resolver;
                                        exports
                                        org.osgi.service.startlevel;
                                        exports
                                        org.osgi.service.url;
                                        exports org.osgi.util.tracker;

                                        provides org.osgi.framework.launch.FrameworkFactory with
                                        org.apache.felix.framework.FrameworkFactory;
                                        provides
                                        org.osgi.framework.connect.ConnectFrameworkFactory
                                        with org.apache.felix.framework.FrameworkFactory;

                                        uses org.apache.felix.framework.ext.ClassPathExtenderFactory;
                                        uses
                                        org.osgi.framework.connect.FrameworkUtilHelper;
                                        }
                                    </moduleInfoSource>
                                </module>
                                <module>
                                    <artifact>
                                        <groupId>org.osgi</groupId>
                                        <artifactId>osgi.promise</artifactId>
                                    </artifact>
                                    <moduleInfoSource>
                                        module osgi.promise {

                                        exports org.osgi.util.function;
                                        exports org.osgi.util.promise;
                                        }
                                    </moduleInfoSource>
                                </module>
                                <module>
                                    <artifact>
                                        <groupId>org.apache.felix</groupId>
                                        <artifactId>org.apache.felix.scr</artifactId>
                                    </artifact>
                                    <moduleInfoSource>
                                        module org.apache.felix.scr {
                                        requires java.logging;
                                        requires java.management;
                                        requires transitive org.apache.felix.gogo.runtime;
                                        requires transitive osgi.core;
                                        requires transitive
                                        osgi.promise;

                                        exports
                                        org.apache.felix.scr.component;
                                        exports org.apache.felix.scr.impl;
                                        exports org.apache.felix.scr.impl.config;
                                        exports org.apache.felix.scr.impl.helper;
                                        exports org.apache.felix.scr.impl.inject;
                                        exports
                                        org.apache.felix.scr.impl.inject.field;
                                        exports org.apache.felix.scr.impl.inject.methods;
                                        exports org.apache.felix.scr.impl.logger;
                                        exports org.apache.felix.scr.impl.manager;
                                        exports
                                        org.apache.felix.scr.impl.metadata;
                                        exports
                                        org.apache.felix.scr.impl.parser;
                                        exports org.apache.felix.scr.impl.runtime;
                                        exports org.apache.felix.scr.impl.xml;
                                        exports org.apache.felix.scr.info;
                                        exports org.kxml2.io;
                                        exports org.osgi.service.component;
                                        exports
                                        org.osgi.service.component.runtime;
                                        exports org.osgi.service.component.runtime.dto;
                                        exports org.xmlpull.v1;

                                        }
                                    </moduleInfoSource>
                                </module>
                                <module>
                                    <artifact>
                                        <groupId>org.apache.felix</groupId>
                                        <artifactId>org.apache.felix.gogo.command</artifactId>
                                    </artifact>
                                    <moduleInfoSource>
                                        module org.apache.felix.gogo.command {
                                        requires transitive org.apache.felix.gogo.runtime;
                                        requires transitive osgi.core;

                                        exports org.apache.felix.gogo.command;

                                        }
                                    </moduleInfoSource>
                                </module>
                                <module>
                                    <artifact>
                                        <groupId>org.apache.felix</groupId>
                                        <artifactId>org.apache.felix.gogo.runtime</artifactId>
                                    </artifact>
                                    <moduleInfoSource>
                                        module org.apache.felix.gogo.runtime {
                                        requires java.logging;

                                        requires transitive osgi.core;

                                        exports org.apache.felix.gogo.runtime;
                                        exports org.apache.felix.gogo.runtime.activator;
                                        exports
                                        org.apache.felix.gogo.runtime.threadio;
                                        exports org.apache.felix.service.command;
                                        exports org.apache.felix.service.threadio;

                                        }
                                    </moduleInfoSource>
                                </module>
                                <module>
                                    <artifact>
                                        <groupId>org.apache.felix</groupId>
                                        <artifactId>org.apache.felix.gogo.shell</artifactId>
                                    </artifact>
                                    <moduleInfoSource>
                                        module org.apache.felix.gogo.shell {
                                        requires transitive org.apache.felix.gogo.runtime;
                                        requires transitive osgi.core;

                                        exports org.apache.felix.gogo.options;
                                        exports
                                        org.apache.felix.gogo.shell;

                                        }
                                    </moduleInfoSource>
                                </module>
                            </modules>
                        </configuration>
                    </execution>
                    <execution>
                        <id>create-runtime-image</id>
                        <phase>package</phase>
                        <goals>
                            <goal>create-runtime-image</goal>
                        </goals>
                        <configuration>
                            <ignoreSigningInformation>true</ignoreSigningInformation>
                            <modulePath>
                                <path>${project.build.directory}/modules</path>
                                <path>${project.build.directory}/${project.artifactId}-${project.version}.jar</path>
                            </modulePath>
                            <modules>
                                <module>osgi.core</module>
                                <module>org.apache.felix.atomos</module>
                                <module>org.apache.felix.gogo.command</module>
                                <module>org.apache.felix.gogo.runtime</module>
                                <module>org.apache.felix.gogo.shell</module>
                                <module>org.apache.felix.scr</module>
                                <module>osgi.promise</module>
                                <module>org.apache.felix.atomos.tests.testbundles.service.impl</module>
                                <module>org.apache.felix.atomos.tests.testbundles.service.impl.activator</module>
                                <module>org.apache.felix.atomos.examples.jlink</module>
                            </modules>


                            <launcher>
                                <name>atomos</name>
                                <module>org.apache.felix.atomos.examples.jlink/org.apache.felix.atomos.examples.jlink.GogoConsole</module>
                            </launcher>
                            <outputDirectory>
                                ${project.build.directory}/atomos
                            </outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>generate-resources</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/modules</outputDirectory>
                            <overWriteReleases>false</overWriteReleases>
                            <overWriteSnapshots>false</overWriteSnapshots>
                            <overWriteIfNewer>true</overWriteIfNewer>
                            <excludeTransitive>true</excludeTransitive>
                            <includeArtifactIds>
                                osgi.core,
                                org.apache.felix.atomos,
                                org.apache.felix.atomos.tests.testbundles.service.contract,
                                org.apache.felix.atomos.tests.testbundles.service.impl,
                                org.apache.felix.atomos.tests.testbundles.service.impl.activator
                            </includeArtifactIds>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
        <pluginManagement>
            <plugins>
                <!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself. -->
                <plugin>
                    <groupId>org.eclipse.m2e</groupId>
                    <artifactId>lifecycle-mapping</artifactId>
                    <version>1.0.0</version>
                    <configuration>
                        <lifecycleMappingMetadata>
                            <pluginExecutions>
                                <pluginExecution>
                                    <pluginExecutionFilter>
                                        <groupId>org.moditect</groupId>
                                        <artifactId>moditect-maven-plugin</artifactId>
                                        <versionRange>${moditect-maven-plugin.version}</versionRange>
                                        <goals>
                                            <goal>add-module-info</goal>
                                        </goals>
                                    </pluginExecutionFilter>
                                    <action>
                                        <ignore></ignore>
                                    </action>
                                </pluginExecution>
                            </pluginExecutions>
                        </lifecycleMappingMetadata>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>
