使用maven-bundle-plugin Embed-Dependency的错误

时间:2011-06-24 01:36:15

标签: maven osgi

我有一个正在建设的Maven项目,我正在尝试添加对twitter4j的引用。

所以我把它添加到pom:

    <dependency>
        <groupId>org.twitter4j</groupId>
        <artifactId>twitter4j-core</artifactId>
        <version>[2.2,)</version>
        <type>jar</type>
        <optional>false</optional>
        <scope>compile</scope>
    </dependency>

当我构建(mvn clean install)时,我得到:

[ERROR] Error building bundle net.stevex.tweetfetcher:tweetfetcher-bundle:bundle:1.0-SNAPSHOT : Unresolved references to [twitter4j] by class(es) on the Bundle-Classpath[Jar:dot]: [net/stevex/tweetfetcher/impl/TweetFetcherImpl.class]

这是有道理的... twitter4j包没有嵌入到捆绑包中。所以我在maven-bundle-plugin的指令中添加了一个Embed-Dependency:

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

现在当我建立时,我得到:

[ERROR] Error building bundle net.stevex.tweetfetcher:tweetfetcher-bundle:bundle:1.0-SNAPSHOT : Unresolved references to [dalvik.system, javax.crypto, javax.crypto.spec, javax.management, javax.management.openmbean, org.apache.commons.logging, org.apache.log4j, org.slf4j.impl, twitter4j.internal.http.alternative] by class(es) on the Bundle-Classpath[Jar:dot, Jar:twitter4j-core-2.2.3.jar]: [twitter4j/internal/logging/CommonsLoggingLogger.class, twitter4j/internal/logging/Log4JLoggerFactory.class, twitter4j/auth/OAuthToken.class, twitter4j/internal/http/HttpClientFactory.class, twitter4j/auth/OAuthAuthorization.class, twitter4j/internal/logging/Log4JLogger.class, twitter4j/conf/ConfigurationBase.class, twitter4j/TwitterAPIMonitor.class, twitter4j/internal/logging/CommonsLoggingLoggerFactory.class, twitter4j/management/APIStatisticsOpenMBean.class, twitter4j/internal/logging/Logger.class]

我不明白为什么缺少twitter4j类,而且我不理解对dalvik.system,javax.crypto等的引用。这里有什么问题?

1 个答案:

答案 0 :(得分:3)

问题是twitter4j项目需要错误列表中列出的所有软件包。使用它时不包括所有传递依赖项。 maven-bundle-plugin有一个Embed Transitive指令,它将嵌入所有传递依赖项

<Embed-Dependency>*;scope=compile|runtime</Embed-Dependency> 
<Embed-Transitive>true</Embed-Transitive>

然而,这种打败了OSGi的目的。这让我知道两个选项:

  1. SpringSource EBR中的第二个搜索包。您只需在搜索框中输入包名称,结果将包含POM文件的xml。 SpringSource包将包含对EBR中其他包的引用,消除了传递依赖的问题。

  2. 使用maven-bundle-plugin的bundle-all目标。此目标将为项目的每个依赖项运行maven bundle插件,并将生成的bundle放入目标目录中。然后,您可以将这些软件包安装到本地存储库中。

  3. 我建议您使用选项1作为您可以找到的尽可能多的捆绑包,然后在SpringSource没有它们时默认为选项2。