gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:14:20 25 4
gpt4 key购买 nike

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

package com.acme.el;

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

功能与问题无关。当我使用 Gradle 将项目构建为 OSGi 包时, list 包含以下指令:
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 项目。

最佳答案

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

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

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

关于osgi - 为什么 bnd 为仅在方法主体中使用的包添加使用指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17421810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com