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

And*_*son 1 osgi maven-2 apache-felix aem

我正在尝试使用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>
Run Code Online (Sandbox Code Playgroud)

我运行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]"
Run Code Online (Sandbox Code Playgroud)

你能帮我解决一下吗?

此致,安德森

Pet*_*ens 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(工具),你的生活会变得如此简单......