【发布时间】:2021-12-18 19:58:31
【问题描述】:
我有一个 named 模块,它在编译时使用了一些 --add-exports。
如何在运行命令行中不手动指定该指令来暗示该指令?
命名模块的编译
javac --add-exports java.base/sun.security.x509=mymodule --module-source-path src -d bin --module mymodule
打包为 JAR
jar -c --file=mymodule.jar --main-class=mymodule.Main -C bin/mymodule
运行
java --module-path . --module mymodule/mymodule.Main
原因:
无法访问类 sun.security.x509.AlgorithmId(在模块 java.base 中),因为模块 java.base 不会将 sun.security.x509 导出到模块 mymodule
- 如果为运行指定
--add-exports,则运行正常java --add-exports java.base/sun.security.x509=mymodule --module-path . --module mymodule/mymodule.Main - 如果在 MANIFEST.MF 中指定了
Add-Exports并且 jar 作为未命名的模块运行,它应该可以正常运行java -jar mymodule.jar,但不会。这曾经在 JRE 11 中工作,现在在 JRE 17 中失败(在撰写本文时最新)
无法访问类 sun.security.x509.AlgorithmId(在模块 java.base 中),因为模块 java.base 不会将 sun.security.x509 导出到未命名模块 @0x53bd815b
http://openjdk.java.net/jeps/261 状态:
Add-Exports 属性值中的模块/包对与命令行选项 --add-exports module/package=ALL-UNNAMED 的含义相同
如何指定导出不是ALL-UNNAMED 而是mymodule?如何真正让它发挥作用?
如果 mymodule 不是主类而是使用更深的库,那么我必须为所有可能的模块指定所有导出,我有时可能会直接从命令行使用这些模块?
【问题讨论】:
标签: java java-module manifest.mf