将类设为公开,但对JAR文件保持私有

时间:2019-02-11 09:40:59

标签: java maven java-11 jigsaw

是否有一种方法可以公开Java类,但只能公开使用JAR文件? AKA,它不是私有包,而是公共包,但不是JAR公共包?

说我有一个这样的结构:

project/
  package1/
    One.java
  package2/
    Two.java
  package3/
    Three.java

由于3个.java文件位于不同的软件包中,因此我需要将其公开。但是,是否有一种方法可以使它们仅对包含该项目的JAR公开?这样,如果另一个项目导入JAR,则看不到某些公共类/字段?

3 个答案:

答案 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伪指令指定要导出的软件包的名称   通过当前模块。对于其他模块中的代码,这将授予访问权限   在编译时和运行时更改为publicprotected类型的   软件包,以及这些类型的publicprotected成员(第6.6节)。   它还为代码提供对这些类型和成员的反射访问   在其他模块中。

并进一步与合格和不合格的出口有关...

  

对于合格的指令,在   软件包及其公共成员和受保护成员,仅可访问   在to子句中指定的模块中编码。模块   to子句中指定的被称为当前朋友   模块。对于不合格的指令,这些类型及其成员   可以访问任何模块中的代码。

答案 2 :(得分:2)

是的,Java 9引入了旨在解决此类问题的模块。