如何使用OSGi中的“提供”范围处理依赖项

时间:2017-03-28 11:53:05

标签: maven osgi dependency-management bnd maven-bundle-plugin

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

让我举个例子。我目前正在使用Dropbox(dropbox-core-sdk 3.0),它有两个具有com.google.android范围的依赖项(javax.servletprovided)。当我使用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中。但是,我希望提供范围的jar也在jar中。

有没有办法下载provided范围的依赖项。如果没有,如何应对这种情况?

2 个答案:

答案 0 :(得分:1)

我不得不顺从那里的Maven BND专家,但我认为你不能通过Maven构建包含提供的依赖项。既然您不太可能在捆绑包之外使用Android组件,那么您是否只能手动下载所需的Jars并将它们放入捆绑包中(Bundle-Classpath)?

答案 1 :(得分:0)

我认为您可以指定要嵌入的依赖项的范围。但要小心,不应该部署像OSGi规范jar这样的依赖项。

通常,您可能只嵌入隐藏在包中的依赖项。最好不要部署与其他软件包交谈所需的任何软件包。

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

尝试此选项:

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