安全地将包导出到Java模块

Iro*_*che 5 java java-9 java-module

我正在回答这个问题,我建议使用exports to语法来防止外部消费者访问模块之间内部使用的代码.

但是在进一步思考时,模块实现的唯一真正的安全检查是它与名称匹配.考虑这个我正在实现两个模块的例子:

module a {
    exports unsafe to b
}

module b {
    requires a
}
Run Code Online (Sandbox Code Playgroud)

该软件包unsafe包含暴露不安全的代码.有没有办法将其安全地导出到内部模块而不将其暴露在外部?

在上面的示例中,流氓实体可以简单地命名其模块b并获得对代码的访问(不安全).该JLS似乎并没有阐明任何可以阻止它.

Nam*_*man 5

Alan指出的模块散列应适用于您的情况.虽然我个人喜欢直接回答您问题的JMOD工具中的描述和示例:

使用--hash-modules选项或jmod散列命令,您可以在每个模块的描述符中记录允许依赖于它的模块内容的哈希值,从而这些模块"捆绑"在一起.

这使您可以允许将包导出到一个或多个特定命名的模块,而不允许通过合格的导出导出.运行时验证模块的记录散列是否与运行时解析的散列匹配; 如果没有,运行时返回错误.