7

我有一个带有单个源文件的项目,此处完整列出:

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指令的含义,还是没有必要在这里使用它?

我制作了一个用于复制的最小示例 GitHub 存储库,您可以将其克隆并作为 Eclipse 中的 Gradle 项目导入。

4

2 回答 2

9

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

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

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

于 2013-07-02T12:27:00.687 回答
1

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

于 2013-09-05T11:54:17.287 回答