是否有一种方法可以公开Java类,但只能公开使用JAR文件? AKA,它不是私有包,而是公共包,但不是JAR公共包?
说我有一个这样的结构:
project/
package1/
One.java
package2/
Two.java
package3/
Three.java
由于3个.java文件位于不同的软件包中,因此我需要将其公开。但是,是否有一种方法可以使它们仅对包含该项目的JAR公开?这样,如果另一个项目导入JAR,则看不到某些公共类/字段?
答案 0 :(得分:8)
使用Java 9中的项目Jigsaw,您可以确切地确定要导出的软件包的位置。例如:
module com.yourproject {
exports com.yourproject.package1;
}
这将确保仅导出package1
。
答案 1 :(得分:3)
现有答案已经指出,适应此问题的方法是模块化代码(添加带有module-info.java
的模块声明作为开始)。只需参考sotms#module-declaration
可以添加
exports
子句以声明该模块将所有内容都包含在内, 并且只有public
类型的特定软件包可供 其他模块:
module com.foo.bar {
requires org.baz.qux;
exports com.foo.bar.alpha;
exports com.foo.bar.beta;
}
如果模块的声明中不包含 exports子句,则它将根本不将任何类型的内容导出到其他模块。
以及JLS部分Exported and Opened packages
exports
伪指令指定要导出的软件包的名称 通过当前模块。对于其他模块中的代码,这将授予访问权限 在编译时和运行时更改为public
和protected
类型的 软件包,以及这些类型的public
和protected
成员(第6.6节)。 它还为代码提供对这些类型和成员的反射访问 在其他模块中。
并进一步与合格和不合格的出口有关...
对于合格的指令,在 软件包及其公共成员和受保护成员,仅可访问 在to子句中指定的模块中编码。模块
to
子句中指定的被称为当前朋友 模块。对于不合格的指令,这些类型及其成员 可以访问任何模块中的代码。
答案 2 :(得分:2)
是的,Java 9引入了旨在解决此类问题的模块。