我有一个包含单个源文件的项目,在此完整列出:
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项目。
答案 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所示。