如何在 OSGi 中处理 "provided" 作用域的依赖关系

How to deal with dependencies with "provided" scope in OSGi

有很多教程,展示了如何处理OSGi项目的依赖关系以及如何将它们转换为bundle。经过一天多的研究,我仍然没有找到如何处理provided范围的依赖关系。

我举个例子。我目前正在使用 Dropbox (dropbox-core-sdk 3.0),它有两个依赖项(com.google.androidjavax.servlet),范围为 provided。当我使用 maven-bundle-pluginbnd 等技术时,它只会下载工件及其传递依赖项。但是,我还需要提供依赖项才能将我的项目导入 OSGi 容器。

我正在使用 maven-bundle-plugin,我的 pom.xml 看起来像:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <extensions>true</extensions>
            <configuration>
                <instructions>
                    <Bundle-SymbolicName>${project.artifactId};singleton:=true</Bundle-SymbolicName>
                    <Bundle-Version>${project.version}</Bundle-Version>
                    <Export-Package>*</Export-Package>
                    <Embed-Transitive>true</Embed-Transitive>
                    <Embed-Dependency>*</Embed-Dependency>
                </instructions>
            </configuration>
        </plugin>
    </plugins>
</build>

即使 Embed-Dependency 说包含所有内容,jar 中也只有依赖项 + 传递依赖项。但是,我希望提供的范围内的罐子也在罐子里。

有什么方法可以下载 provided 范围内的依赖项。如果没有,这种情况怎么处理?

我认为您可以指定要嵌入的依赖项的范围。请注意,某些依赖项(如 OSGi 规范 jar)永远不应部署。

一般来说,您只能嵌入隐藏在包中的依赖项。最好不要部署任何需要与其他包通信的包。

例如,servlet api 通常由您使用的 httpservice 包提供。

试试这个选项:

<Embed-Dependency>*;scope=compile|provided</Embed-Dependency>

我不得不服从那里的 Maven BND 专家,但我认为您不能通过 Maven 构建包含提供的依赖项。由于您不太可能在包外使用 Android 组件,难道您不能手动下载所需的 Jar 并将它们放入包中(Bundle-Classpath)吗?