FrameworkUtil.getBundle винаги ми връща NULL

Опитвам се да инсталирам пакет с помощта на OSGi framework. По-долу е моят код, който се опитва да получи 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 class-

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. Защото мисля, че всеки пакет има свой собствен Classloader, 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" ще върне нула. Ако предоставеният от вас клас е допълнителен клас, експортиран от самия пакет на рамката (bundle(0)), тези класове ще върнат нулев резултат. Причината е точно поради същата причина, която обясни Нийл Бартлет; тези класове не се разрешават директно от средство за зареждане на класове на пакет OSGI. Пакетите, които импортират класове, предоставени от системния пакет, работят перфектно; просто FrameworkUtil няма да ви уведоми, че тези класове идват от системния пакет.

Причината да направите това е, че искате да получите ресурс от пакета, от който идва класът.

person Tom Rutchik    schedule 25.01.2019