未解决的对[org.osgi.service.component]的引用

时间:2013-07-02 18:38:19

标签: maven-2 osgi cq5 apache-felix

我正在尝试使用maven-bundle-plugin创建一个包。该项目的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">

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.adobe.support.examples</groupId>
    <artifactId>com.adobe.support.examples.osgi.service</artifactId>
    <version>1.0.8</version>
    <packaging>bundle</packaging>
    <name>OSGi Service Example</name>
    <url>http://blogs.adobe.com/kmossman</url>
    <description>Adobe Developer Support OSGi Service Example</description>
    <!--  
    Credit: This example is based on Moritz Havelock's http://in-the-sling.blogspot.com/ 

    I suggest you use the most current versions of the plugin's. 
    Search the Central Repository for the most current versions http://search.maven.org/

    Use the search strings below and update the appropriate versions

    // Felix
    g:"org.apache.felix" a:"org.apache.felix.framework"
    g:"org.apache.felix" a:"maven-bundle-plugin"
    g:"org.apache.felix" a:"maven-scr-plugin"
    g:"org.apache.felix" a:"org.osgi.core"
    // Maven
    g:"org.apache.maven.plugins" a:"maven-compiler-plugin"  
    // Sling
    g:"org.apache.sling" a:"maven-sling-plugin"
    -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.build.java.version>1.6</project.build.java.version>
        <!-- Felix -->
        <org.apache.felix.framework.version>4.0.2</org.apache.felix.framework.version> 
        <org.apache.felix.maven-bundle-plugin.version>2.3.7</org.apache.felix.maven-bundle-plugin.version>    
        <org.apache.felix.maven-src-plugin.version>1.7.4</org.apache.felix.maven-src-plugin.version>
        <org.apache.felix.org.osgi.core>1.4.0</org.apache.felix.org.osgi.core>
        <!-- Maven -->
        <org.apache.maven.plugins.maven-compiler-plugin.version>2.3.2</org.apache.maven.plugins.maven-compiler-plugin.version>
        <org.apache.maven.plugins.maven-surefire-plugin.version>2.12</org.apache.maven.plugins.maven-surefire-plugin.version>
        <!-- Sling -->
        <org.apache.sling.maven-sling-plugin.version>2.1.0</org.apache.sling.maven-sling-plugin.version>
    </properties>
    <build>

        <plugins>
            <!--  Maven will compile our source java classes using
             the "project.build.java.version" specified -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${org.apache.maven.plugins.maven-compiler-plugin.version}</version>
                <configuration>
                  <source>${project.build.java.version}</source>
                  <target>${project.build.java.version}</target>
                </configuration>
            </plugin>
            <!--  this will install the OSGi bundle into Sling for us 
            we now upload the jar file automatically when we build with this plug-in -->
            <plugin>
                <groupId>org.apache.sling</groupId>
                <artifactId>maven-sling-plugin</artifactId>
                <version>${org.apache.sling.maven-sling-plugin.version}</version>
                <executions>
                    <execution>
                        <id>install-bundle</id>
                        <goals>
                            <goal>install</goal>
                        </goals>
                        <configuration>
                            <slingUrl>http://localhost:4502/system/console/install</slingUrl>
                            <user>admin</user>
                            <password>admin</password>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <!-- This will create the OSGI-INF for us that handles the Activator Class for us
                we now auto-generate the details in our bundle with this plug-in-->
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-scr-plugin</artifactId>
                <extensions>true</extensions>
                <version>${org.apache.felix.maven-src-plugin.version}</version>
                <executions>
                    <execution>
                        <id>generate-scr-scrdescriptor</id>
                        <goals>
                            <goal>scr</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>         
            <plugin>
                <!-- This will create the OSGi /META-INF/MANIFEST.MF for us
                we now auto-generated the filea for us with this plug-in -->
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <extensions>true</extensions>
                <version>${org.apache.felix.maven-bundle-plugin.version}</version>
                <configuration>
                    <instructions>
                        <Export-Package>com.adobe.support.examples.osgi.service</Export-Package>
                        <Import-Package>org.osgi.framework;version="1.3.0"</Import-Package>
                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
                        <Bundle-Name>${project.name}</Bundle-Name>
                        <Bundle-Vendor>Kurt Mossman</Bundle-Vendor>
                        <!-- 
                            Inserting content into the JCR and installing some files on the server with your bundle. 

                            Sling-Initial-Content

                                The first line will overwrite the contents of the node at content/osgitest with test.json 
                                NOTE: uninstall:=false says that it will not remove the content when I remove the package. 
                                    This could be set to true to also remove the content when the package is removed the choice is yours. 

                                The second line will overwrite the path will install the files and overwrite them if you re-install. 
                         -->
                        <Sling-Initial-Content>
                            SLING-INF/initial-content/content/osgitest;path:=/content/osgitest;overwrite:=true;uninstall:=false,
                            SLING-INF/initial-content/apps/samples/osgitest;path:=/apps/samples/osgitest;overwrite:=true;uninstall:=true
                        </Sling-Initial-Content>
                    </instructions>
                </configuration>
            </plugin>
            <!--  use the surefire plugin to run the test cases
            we use a thread count of 4 to increase the performance of the test time. -->
            <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-surefire-plugin</artifactId>
               <version>${org.apache.maven.plugins.maven-surefire-plugin.version}</version>
               <configuration>
                    <parallel>methods</parallel>
                    <threadCount>4</threadCount>
               </configuration>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>org.apache.felix</groupId>
            <artifactId>org.osgi.core</artifactId>
            <version>${org.apache.felix.org.osgi.core}</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.8.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.felix</groupId>
            <artifactId>org.apache.felix.scr.annotations</artifactId>
            <version>1.9.0</version>
        </dependency>
        <dependency>
    <groupId>org.apache.felix</groupId>
    <artifactId>org.osgi.compendium</artifactId>
    <version>1.4.0</version>
</dependency>
    </dependencies>
</project>

运行mvn install命令时出现以下错误。

"Unresolved references to [org.osgi.service.component] by class(es) on the Bundle-Classpath[Jar:dot]: [com/adobe/support/examples/com/adobe/support/examples/osgi/service/SampleServiceImpl.class]"

你能帮我解决一下吗?

此致 安德森

1 个答案:

答案 0 :(得分:5)

问题在于,你没有心智能模型表明你的应用正在做什么以及应该如何在OSGi上处理......所以让我试着解释一下。

该消息表明您的SampleServiceImpl类使用包org.osgi.service.component中的类。当bnd,maven中的插件使OSGi显示,分析你的代码它创建对该包的引用,这是准备导入。然后然后查找指令Import-Package。这是默认的*(通配符),这意味着它应该导入所有引用。但是,在您的POM中,您使用org.osgi.framework;version="1.3.0覆盖此指令。由于此包与org.osgi.service.component包不匹配,因此bnd会忽略此引用。即Import-Package指令旨在装饰导入(版本,可选,属性,指令等),但通常不应该被触及,因为bnd非常适合在此基础上进行装饰。类路径。

但是,在bnd构建了jar之后,它会运行一个独立的验证程序来检查它的功能是否正常。然后,此验证程序将看到对未导入的类的引用,并将其报告为错误,这是正确的。一个包含引用另一个类的类的bundle既不是导入也不是包含,它必然会在运行时导致Class Not Found Exception。

所以,正如bnd中的许多内容一样,解决方案很简单:只需删除Import-Package标头并让bnd完成其工作,其默认值通常是最佳解决方案,尤其是如果您还没有线索的话。只有当您在清单中获得不需要的导入时,才应使用此标题。

现在,如果你想使用bnd(工具),你的生活会变得更加简单......

相关问题