Eclipse:为什么 ProjectA 的库 jar 可以访问 ProjectB 的库 jar,即使库 jar 没有标记为已导出?

Eclipse: Why can a library-jar of ProjectA access a library-jar of ProjectB even though the library-jar isn't marked as exported?

我有两个两个项目,我们称它们为项目 A 和 B。项目 A 使用项目 B 作为库项目,项目 B 有一个 "library.jar"。该库不由项目 B 导出。但是,项目 A 使用的第三方库可以使用项目 B 中的 "library.jar"。

这怎么可能?

如果我在项目 A 中创建一个 class 试图引用这个确切的库,它不能导入这个库,但是导入的库可以吗?

它肯定在使用那个库,因为如果我从项目 B 的构建路径中删除该库,它也不会对项目 A 中的库起作用。

"exported" 标志是一个 IDE 专有设置,用于正确管理您的项目(依赖项)。 在编译时,您的 class 路径中的每个 class 都可以使用,因此从技术上讲,您的项目 A 可以使用 "library.jar" 但您的 IDE 设置阻止您这样做。

已导出表示API未导出表示内部:

术语 exported 来自 OSGi/Plug-in 开发(参见 Eclipse help: Plug-in Runtime)并指代 visibility:导出的构建 class 条目在构建路径中具有该项目的项目中可见。 未导出构建路径条目是在上游项目构建路径的一部分,但是不可见(源码中不能引用)

Eclipse 有自己的编译器,在编译时支持模块化(为 OSGi 开发,但通过 required projectsexport[=29= 以更简单的方式提供] 标志也用于普通 Java)。如果您不使用 OSGi,您将只有一个平坦的构建路径,而不会在运行时进行模块化。