Java 9 中 Jigsaw 项目的主要目标之一是可靠的配置。也就是说,Java 9 promise 解决类路径机制缺陷,该缺陷允许 java 启动器运行程序,而无需确保所有必要的类都可用于在运行时加载,这曾经导致 java.lang.NoClassDefFoundError
s。
这是通过在 module-info.java
中声明模块依赖关系和全新的 --module-path
选项来完成的。在启动 Java 应用程序之前分析模块图。
但是,我仍然可以执行以下操作。
- 假设我有两个模块
com.spacey.explorer
和com.spacey.rocket
。com.spacey.explorer
使用由com.spacey.rocket
模块定义和导出的类com.spacey.rocket.RocketZ
。在编译和 JARing 两个模块后,一切正常运行。 - 现在,我从
com.spacey.rocket
模块中删除com.spacey.rocket.RocketZ
类型,并仅重新编译和重新 JAR 一个模块。 - 我用新编译的
com.spacey.rocket
模块运行之前编译的com.spacey.explorer
模块。 - 我得到 ...
java.lang.NoClassDefFoundError
,这可能会在应用程序正常运行大约 4 小时后出现。
有没有办法真正确保在运行 Java 应用程序时不仅验证模块图(模块路径)的完整性,而且对实际类型的可访问性进行全面检查?
最佳答案
Is there a way to really make sure that when running Java application not only the module graph (module path) completeness is verified but also a comprehensive check of the actual type accessibility is done?
不在 JVM 中,不。模块系统在工件级别上运行,如果工件声称是正确的模块,我们会很高兴 is present .除此之外,不会执行进一步的检查。
也就是说,JDeps应该可以帮助你。它分析您的项目及其依赖关系,并在各个类的级别上运行。它将指出找不到的依赖项。
在你的例子中:
$ jdeps -R --module-path jars-dir -m com.spacey.explorer
> com.spacey.explorer -> com.spacey.rocket not found
关于java - Java 9 中的可靠配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46457947/