FrameworkUtil.getBundle всегда возвращает мне NULL

Я пытаюсь установить пакет с помощью платформы OSGi. Ниже приведен мой код, который пытается получить bundleContext.

В приведенном ниже коде каждый раз, когда эта строка FrameworkUtil.getBundle возвращает мне null.

Ниже мой код приложения-

    public App() {

        String basePath = "C:\\Tool\\LocalStorage";

        final BundleContext bundleContext = FrameworkUtil.getBundle(this.getClass()).getBundleContext();

                 // install various bundles-

        final Bundle bundle = bundleContext.installBundle(localFilenameOfBundles);
        bundle.start();     

        }

При отладке кода я обнаружил, что в классе getBundle method класса FrameworkUtil-

public static Bundle getBundle(final Class< ? > classFromBundle) {
        // We use doPriv since the caller may not have permission
        // to call getClassLoader.
        Object cl = AccessController
                .doPrivileged(new PrivilegedAction<Object>() {
            public Object run() {
                return classFromBundle.getClassLoader();
            }
        });

        if (cl instanceof BundleReference) {
            return ((BundleReference) cl).getBundle();
        }
        return null;
    }

cl is not an instance of BundleReference и поэтому он всегда возвращает мне NULL. И когда я проверил на cl, я нашел что-то вроде этого-

sun.misc.Launcher$AppClassLoader@69956995 и который, я считаю, не является экземпляром BundleReference? Мне нужно это org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader

Ниже мой файл pom.xml:

<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>com.host.Stream</groupId>
        <artifactId>Stream-parent</artifactId>
        <version>2.0.0-SNAPSHOT</version>
        <relativePath>../Build/superpom</relativePath>
    </parent>

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.host.personallization.eye</groupId>
    <artifactId>eye</artifactId>
    <packaging>jar</packaging>
    <name>eye</name>


    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-eclipse-plugin</artifactId>
                <configuration>
                    <downloadSources>true</downloadSources>
                    <downloadJavadocs>false</downloadJavadocs>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>                         <!-- Configuration of the archiver -->
                    <archive>                       <!-- Manifest specific configuration -->
                        <manifest>                  <!-- Classpath is added to the manifest of the created jar file. -->
                            <addClasspath>true</addClasspath>   <!-- Configures the classpath prefix. This configuration option is used to 
                                specify that all needed libraries are found under lib/ directory. -->
                            <classpathPrefix>lib/</classpathPrefix> <!-- Specifies the main class of the application -->
                            <mainClass>com.host.Stream.eye.eyeApp</mainClass>
                        </manifest>
                    </archive>
                    <includes>
                        <include>**/*.xml</include>
                        <include>**/*.class</include>
                    </includes>
                    <finalName>${project.artifactId}</finalName>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.6</version>
                <executions>
                    <execution>
                        <id>unpack</id>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>unpack</goal>
                        </goals>
                        <configuration>
                            <artifactItems>
                                <artifactItem>
                                    <groupId>com.host.raptor</groupId>
                                    <artifactId>ConfigWeb</artifactId>
                                    <type>war</type>
                                    <overWrite>true</overWrite>
                                    <outputDirectory>buildsrc/StreamConf</outputDirectory>
                                    <includes>**</includes>
                                </artifactItem>
                            </artifactItems>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <outputDirectory>target/config/StreamConf</outputDirectory>
                    <resources>
                        <resource>
                            <directory>buildsrc/StreamConf</directory>
                            <includes>
                                <include>**</include>
                            </includes>
                        </resource>
                    </resources>
                </configuration>
            </plugin>
            <plugin>
                <groupId>com.google.code.maven-replacer-plugin</groupId>
                <artifactId>maven-replacer-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>replace</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <file>target/config/StreamConf/eyewiring.xml</file>
                    <regex>false</regex>
                    <replacements>
                        <replacement>
                            <token>dynamic_build_label_place_holder</token>
                            <value>${project.artifactId}-${project.version}-${buildNumber}</value>
                        </replacement>

                    </replacements>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <id>assembly</id>
                        <goals>
                            <goal>single</goal>
                        </goals>
                        <configuration>
                            <descriptors>
                                <descriptor>assembly.xml</descriptor>
                            </descriptors>
                            <finalName>${project.artifactId}-${project.version}-${buildNumber}</finalName>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>findbugs-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
    <dependencies>

        <dependency>
            <groupId>com.host.Stream</groupId>
            <artifactId>Streamframework</artifactId>
            <version>2.0.0-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>com.host.external</groupId>
            <artifactId>ucirrus-db</artifactId>
            <version>0.7.3</version>
        </dependency>

        <dependency>
            <groupId>com.host.Stream</groupId>
            <artifactId>Streamcore</artifactId>
            <version>2.0.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.core</artifactId>
            <version>4.3.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.osgi</groupId>
            <artifactId>spring-osgi-core</artifactId>
            <version>1.2.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.osgi</groupId>
            <artifactId>spring-osgi-extender</artifactId>
            <version>1.2.1</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>3.2.3.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>3.2.3.RELEASE</version>
        </dependency>


        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>3.2.3.RELEASE</version>
        </dependency>


        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>3.2.3.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.osgi</groupId>
            <artifactId>spring-osgi-io</artifactId>
            <version>1.2.1</version>
        </dependency>
    </dependencies>
</project>

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


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


Ответы (2)


Ваш класс не был загружен пакетным загрузчиком классов OSGi. На самом деле он был загружен AppClassLoader, который является загрузчиком классов по умолчанию в JVM, который загружает классы в основной путь к классам приложения, то есть банки и каталоги, перечисленные с переменной командной строки -classpath.

Вы действительно создали пакет OSGi? Вы запустили OSGi Framework и установили в него свой пакет? Потому что похоже, что вы просто используете здесь простую Java.

person Neil Bartlett    schedule 14.08.2013
comment
Я пытаюсь сделать следующее: я пытаюсь программно установить различные пакеты из приведенного выше кода. После того, как я получу bundleContext, я могу использовать его для установки и запуска различных пакетов, которые я хотел сделать. Таким образом, приведенный выше код представляет собой простой проект maven, и это файл pom.xml, который я предоставил выше. Как я могу запустить в него фреймворк OSGi? Я отредактировал код своего приложения, чтобы показать, как я устанавливаю и запускаю пакеты. - person arsenal; 15.08.2013
comment
Вы можете запустить платформу OSGi с помощью org.osgi.framework.launch.FrameworkFactory API. Я написал об этом подробное сообщение в блоге 2 года назад: njbartlett.name/2011/ 07/03/embedding-osgi.html - person Neil Bartlett; 15.08.2013
comment
Спасибо, Нил, за ссылку. Когда я начал ее использовать, я получил NoSuchElementException. Для этого я открыл новый вопрос. Любая помощь будет оценена по этому поводу. - person arsenal; 15.08.2013
comment
Это исключение означает, что вы не поместили реализацию OSGi Framework (например, Felix или Equinox) в путь к классам среды выполнения. - person Neil Bartlett; 15.08.2013

Я обнаружил, что есть еще один не столь очевидный случай, когда «FrameworkUtil.getBundle» возвращает значение null. Если указанный вами класс является дополнительным классом, экспортированным самим системным пакетом фреймворка (bundle(0)), эти классы вернут нулевой результат. Причина точно по той же причине, которую объяснил Нил Бартлетт; эти классы не разрешаются напрямую из загрузчика классов пакета OSGI. Пакеты, импортирующие классы из системного пакета, работают отлично; просто FrameworkUtil не даст вам знать, что эти классы взяты из системного пакета.

Причина, по которой вы можете сделать это, заключается в том, что вы хотите получить ресурс из пакета, из которого исходит класс.

person Tom Rutchik    schedule 25.01.2019