Лучший способ добавить сторонние зависимости maven в пакет OSGi

Я только начал разработку OSGI и изо всех сил пытаюсь понять, как лучше всего обрабатывать зависимые / сторонние JAR или зависимости maven.

т.е. если я создаю пакет, то, скорее всего, я буду использовать несколько сторонних JAR-файлов. Когда я создаю свой пакет JAR для развертывания в OSGI, очевидно, что эти сторонние JAR не включены, и поэтому пакет не будет работать.

Я понимаю, что один из вариантов - превратить эти JAR в пакеты, а также развернуть их в контейнере OSGI. Но я не могу сделать это для каждой зависимости maven, которую я собираюсь использовать.

Как лучше всего справиться с подобной ситуацией? Есть ли способ встроить файл jar непосредственно в пакеты?

Ниже показано мое основное приложение Java, которое запускает фреймворк OSGi, а затем пытается установить простой пакет, который зависит от Log4j. И в будущем у меня может быть и другая сторонняя зависимость от maven ..

public class OSGiTest {

    private static Framework framework;

    public static void main(String[] args) {

        try {
            FileUtils.deleteDirectory(new File("felix-cache"));
            FrameworkFactory frameworkFactory = ServiceLoader.load(FrameworkFactory.class).iterator().next();

            framework = frameworkFactory.newFramework(new HashMap<String, String>());
            framework.start();

            installAndStartBundle("DependencyBundle", "1.0.0");

        } catch (IOException e) {
            e.printStackTrace();
        } catch (BundleException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void installAndStartBundle(final String name, final String version) throws BundleException, Exception {

        final String basePath = "S:\\maven.repo\\dependency\\DependencyBundle\\1.0.0";
        final BundleContext bundleContext = framework.getBundleContext();
        final List<Bundle> installedBundles = new LinkedList<Bundle>();

        BundleActivator b = new org.ops4j.pax.url.mvn.internal.Activator();
        b.start(bundleContext);

        String filename = name + ModelConstants.DASH + version + ModelConstants.DOTJAR;
        String localFilename = ModelConstants.FILE_PROTOCOL + basePath+ File.separatorChar + filename;

        installedBundles.add(bundleContext.installBundle(localFilename));

        for (Bundle bundle : installedBundles) {
            bundle.start();
        }
    }
}

Ниже мой файл pom.xml для пакета OSGi DependencyBundle-

<?xml version="1.0" encoding="UTF-8"?>
<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">

    <!-- POM Information about the Project -->
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.host.personalize.goldeneye.dependency</groupId>
    <artifactId>DependencyBundle</artifactId>
    <version>1.0.0</version>
    <!-- Packing Type is bundle for OSGI Library Bundle -->
    <packaging>bundle</packaging>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>org.springframework.beans</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>org.springframework.context</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>org.springframework.core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.servicemix.bundles</groupId>
            <artifactId>org.apache.servicemix.bundles.cglib</artifactId>
        </dependency>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.core</artifactId>
            <version>4.3.0</version><!--$NO-MVN-MAN-VER$ -->
            <type>jar</type>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.compendium</artifactId>
            <version>4.3.0</version><!--$NO-MVN-MAN-VER$ -->
            <type>jar</type>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
    </dependencies>

    <!-- Build Configration -->
    <build>
        <plugins>
            <!-- Apache Felix Bundle Plugin - For Generation of Manifest after Compile 
                phase -->
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <!-- Configuration for generating the Manifest.mf -->
                <configuration>
                    <manifestLocation>src/main/resources/META-INF</manifestLocation>
                    <!-- Manifest Headers which need to customized during manifest generation -->
                    <instructions>
                        <Bundle-SymbolicName>DependencyBundle</Bundle-SymbolicName>
                        <Bundle-Activator>com.host.personalize.goldeneye.dependency.dependencybundle.Activator</Bundle-Activator>
                    </instructions>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

person arsenal    schedule 27.08.2013    source источник


Ответы (1)


Если вы только начинаете, зачем углубляться в тонкости среды выполнения фреймворка?

Выберите более простой и, возможно, более короткий путь и начните с предварительной среды выполнения, такой как Apache Karaf, вы можете просто установите пакеты с помощью pax-url .jira.com / wiki / display / paxurl / Mvn + Protocol "rel =" nofollow "> обработчик URL-адресов maven из командной строки, вы также можете использовать wrap: protocol для динамического добавления действительных манифестов OSGi для зависимостей.

Как только вы поймете, что делаете, используя его, вы сможете узнать о нем и создать свой собственный.

person earcam    schedule 27.08.2013
comment
Хороший ответ, Karaf также поддерживает предоставление нескольких пакетов с помощью файла функций: karaf.apache.org/manual/latest-2.3.x/users-guide/ - person samlewis; 28.08.2013
comment
Спасибо Earcam за предложение. Напишите, что я использовал Felix в качестве контейнера OSGi, если мне нужно использовать Karaf, как я могу программно запустить контейнер OSGi через код Java? Если возможно, можете ли вы предоставить простой пример, который использует Apache Karaf в качестве контейнера OSGi и устанавливает пакеты, как в моем примере использования выше? - person arsenal; 28.08.2013
comment
Вероятно, это будет сложно, однако вы можете использовать обработчик maven pax-url с минимальными зависимостями (нет?) С Felix / Equinox, если вы намерены внедрять с самого начала. - person earcam; 28.08.2013
comment
Итак, вы говорите, что я должен использовать Феликс в качестве контейнера, как я сейчас делаю, но я могу установить зависимость Log4j с помощью обработчика maven pax-url? Если да, то можете ли вы привести простой пример? Я понятия не имею об обработчике maven pax-url и о том, как его использовать. - person arsenal; 28.08.2013
comment
Нет - я говорю, что учитесь с удобной для новичков средой выполнения, такой как Karaf. Как только вы усвоите концепции, то для многих вещей, которые вы пытаетесь сделать, вы найдете лучший, другой способ. Вы обнаружите, например, что другой проект pax, pax-logging, предоставляет отличная оболочка для всех различных поставщиков журналов. - person earcam; 28.08.2013
comment
Понятно ... Я обязательно попробую руководство для разработчиков Karaf .. А пока есть ли способ решить указанную выше проблему с зависимостями? Любая идея? - person arsenal; 28.08.2013
comment
Либо поместите их в каталог и используйте Felix file install, либо используйте консоль Gogo и обработчик URL-адресов pax mvn. Я до сих пор не понимаю, почему вы пытаетесь изучить OSGi, но вместо того, чтобы сначала задыхаться об основах, вы увязли в технических тонкостях управления средой выполнения - невозможно понять как и почему, если сначала не пойму что. - person earcam; 28.08.2013