为什么bnd为仅在方法体中使用的包添加uses指令?

时间:2013-07-02 09:20:05

标签: osgi gradle bnd

我有一个包含单个源文件的项目,在此完整列出:

package com.acme.el;

public class ExpressionUtils {
    public static Object evaluate() {
        new org.apache.commons.el.ExpressionEvaluatorImpl();
        return null;
    }
}

功能与问题无关。当我使用Gradle将项目构建为OSGi包时,清单包含以下指令:

Export-Package: com.acme.el;uses:="org.apache.commons.el";version="1.0"

令我感到困惑的是uses指令。正如我已经理解了该指令,它意味着定义其他包的依赖关系,这些包需要传播到导入此导出包的其他包 - 如果我的类定义或方法签名引用org.apache.commons.el包中的类,实例。但是在这个类中,对org.apache.commons.el的依赖完全包含在方法体中的中。它没有在API中公开,也没有其他包导入com.acme.el可以获得在方法中创建的ExpressionEvaluatorImpl实例。所以依赖不应该传播,对吧?

我是否误解了uses指令的含义,还是在这里使用它是不必要的?

我创建了a minimal example GitHub repo for reproduction,你可以在Eclipse中克隆和导入Gradle项目。

2 个答案:

答案 0 :(得分:8)

如果在您的bnd文件中设置了-experiments: true,则应该获得正确的用途:子句,仅基于公共API引用。

问题是bnd从一开始就使用了所有导入来计算使用限制。这是迄今为止最简单的,迄今为止,没有人抱怨它。但是,我确实创建了扫描公共API的代码,但从未有足够的信心将其从实验阶段中删除......当前模型创建了太多的使用限制,但通常应该是安全的方式。

此代码尚未经过充分测试,我也不相信更改此计算不会在现有版本中产生问题。所以我在这里有点束缚。

答案 1 :(得分:1)

Gradle 1.7 uses bnd 2.1.0,而不是早期Gradle发行版使用的bnd 1.50.0。使用Gradle 1.7时不会出现此问题,如this GitHub repo所示。