1

我正在尝试使用 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]"

你能帮我修一下吗?

问候, 安德森

4

1 回答 1

5

问题是你没有一个关于你的应用程序在做什么以及应该如何在 OSGi 上处理的心智模型......所以让我试着解释一下。

该消息表明您的SampleServiceImpl类使用包中的一个类org.osgi.service.component。当 bnd 时,maven 中制作 OSGi 清单的插件分析您的代码时,它会创建对该包的引用,这是为导入做准备。bnd 然后查找指令Import-Package。这是默认情况下*(通配符),这意味着它应该导入所有引用。但是,在您的 POM 中,您使用org.osgi.framework;version="1.3.0. 由于此包与该包不匹配org.osgi.service.component,因此 bnd 忽略此引用。即 Import-Package 指令旨在修饰导入(版本、可选、属性、指令等),但通常不应触及,因为 bnd 非常擅长根据类路径进行自我修饰。

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

所以,就像 bnd 中的很多东西一样,解决方案很简单:只需删除 Import-Package 标头并让 bnd 完成它的工作,它的默认值通常是最好的解决方案,特别是如果你还不知道的话。只有当您在清单中获得不需要的导入时,您才应该使用此标头。

现在,如果你使用 bnd(tools),你的生活会简单得多......

于 2013-07-03T06:32:23.067 回答