java - Java 9 中的可靠配置

标签 java java-9

Java 9 中 Jigsaw 项目的主要目标之一是可靠的配置。也就是说,Java 9 promise 解决类路径机制缺陷,该缺陷允许 java 启动器运行程序,而无需确保所有必要的类都可用于在运行时加载,这曾经导致 java.lang.NoClassDefFoundErrors。

这是通过在 module-info.java 中声明模块依赖关系和全新的 --module-path 选项来完成的。在启动 Java 应用程序之前分析模块图。

但是,我仍然可以执行以下操作。

  1. 假设我有两个模块 com.spacey.explorercom.spacey.rocketcom.spacey.explorer 使用由 com.spacey.rocket 模块定义和导出的类 com.spacey.rocket.RocketZ。在编译和 JARing 两个模块后,一切正常运行。
  2. 现在,我从 com.spacey.rocket 模块中删除 com.spacey.rocket.RocketZ 类型,并仅重新编译和重新 JAR 一个模块。
  3. 我用新编译的 com.spacey.rocket 模块运行之前编译的 com.spacey.explorer 模块。
  4. 我得到 ... 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/

相关文章:

Java 9 : jigsaw and hibernate 5. 2.12 不工作

java - 如何从包含其他字符的字符串中获取int?

java - MongoDB:所有完整叶路径

java - 使用 HibernateCallback 进行 Spring 测试不起作用

java - Java 9 需要 Spring 5 吗?

JavaFX:更新到 Java 9 后出现奇怪的 ClassNotFoundException

java - 在哪里可以找到 Java 9 模块描述符引用?

java - 当我在 Debug模式下执行 Gradle 测试时 IDEA 卡住

java - 如何在操作书中的 mahout 中运行示例

java - List.of() 或 Collections.emptyList()