Java 9中的可靠配置

Java 9中的可靠配置,java,java-9,Java,Java 9,Java9中Jigsaw项目的主要目标之一是可靠的配置。也就是说,Java 9承诺解决类路径机制缺陷,该缺陷允许Java启动器运行程序,而不确保所有必要的类都可以在运行时加载,这通常会导致Java.lang.NoClassDefFoundErrors 这是通过在module info.java中声明模块依赖项和全新的--module path选项来实现的。在启动Java应用程序之前,将分析模块图 然而,我仍然可以做到以下几点 假设我有两个模块com.spacey.explorer和com.spa

Java9中Jigsaw项目的主要目标之一是可靠的配置。也就是说,Java 9承诺解决类路径机制缺陷,该缺陷允许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应用程序时,不仅验证了模块图(模块路径)的完整性,而且还对实际的类型可访问性进行了全面检查

    是否有办法确保在运行Java应用程序时,不仅验证了模块图(模块路径)的完整性,而且还对实际的类型可访问性进行了全面检查

    不是在JVM中,不是。模块系统在工件级别上运行,如果工件声称是正确的模块,系统会很高兴。除此之外,没有进行进一步的检查

    也就是说,我应该能够帮助你。它分析您的项目及其依赖项,并在单个类的级别上进行操作。它将指出找不到的依赖项

    在您的示例中:

    $ jdeps -R --module-path jars-dir -m com.spacey.explorer
    
    > com.spacey.explorer    -> com.spacey.rocket    not found
    

    我认为另一个答案在技术方面有所帮助,但除此之外,我认为你对可靠部分的理解有点错误

    讨论脆性类路径:

    所有这些都是脆弱类路径的结果。这意味着类加载器没有一个好的机制来区分一个加载的类和另一个同名的类,或者将一个类加载器加载的类与另一个类加载的类隔离开来

    模块对此给出的答案是:

    Java模块将提供可靠的配置和强大的封装。如果您有不兼容,您将在构建时发现这些不兼容,而不是在应用程序开始在生产环境中运行后的某个不确定的时间

    换句话说:我认为你认为模块是为了防止各种错误而设计的,这是一种误解。模块使您更容易构建东西。您发现了一个很好的示例,它不一定会转化为关于运行时问题的完美安全网


    换句话说:您对“可靠模块”的解释与Jigsaw项目实际提供的“可靠模块”承诺不同步。

    否。模块系统从不检查类。您能详细说明(3)的含义吗。如果新编译的
    c.s.rocket
    中缺少类,如何运行
    c.s.explorer
    。@nullpointer与(1)
    java--module path../jars dir--module com.spacey.explorer/com.spacey.explorer.MissionApp
    中的内容完全相同,实际上jdeps可以完成这项工作。还值得添加
    -verbose:class
    选项,以获得更多信息(类级)输出。