Java SE 11 Sliver学习笔记(第十一章)

Java SE 11 sliver资格考试相关

第十一章 モジュールシステム

間違えた:1,4,6

間違えし易い:

分からない: 1,2,3,4,5,6,7

回顾
  1. module系统存在的意义。可以更方便的管理需要公开的包和不想公开的包。module-info.java中记述的内容为以下两条:

    1. 要公开哪个包
    2. 要使用其他的哪个module

    另外需要注意,module-info.java的生成位置,写法为module hello {}。module之后的是module的名字,如果中括号里什么都不写,意味着任何包都不公开,也不利用任何的外部module。为了实现模组化需要将module-info.java与source code一起编译。编译文件的保存地址为mods文件夹。

    编译命令:javac -d classfile的保存目录 需要编译的文件的目录。因此第二参数需要包含module-info.java文件的路径和想要编译的源代码的路径。

  2. 关于module的运行问题。命令:java --module-path module文件路径 -m 要运行的module class。当想运行有被module包含的class时,需要在module和想要运行的class的完全修饰名之间加上/
    例如 :java --module-path mods -m hello/com.sample.Main

  3. module的公开设定相关。例如在test module中设置需要公开的包时需要在module-info.java中这样写:

    1
    2
    3
    module test{
    exports com.test; //记述需要公开的包。不写的默认为非公开
    }

    而如果hello module想要利用test中的方法,需要在自己的module-info.java中做如下记述:

    1
    2
    3
    module hello {
    requires test; //使用requires来引入自己想利用的module
    }

    注意:更改完成后需要重新编译。

  4. 关于各个module之间的依存关系问题。当module1依存module2,module2依存module3时,module1是无法使用module3中的类的。因为module2中引入的包,是为了module2而引入的,如果想在module1中也能使用的module3的类,需要在module2中做出如下的设置:

    1
    2
    3
    module module2 {
    requires transitive module3; //transitive是推移的意思,意味着在module1中也可以使用module3
    }
  5. 参考这里。关于java內建的module。都被归纳到java.base module中,这个module即使不用requires声明会被直接代入。

  6. 关于确认module的命令,想要确认一个module公开了什么包,依存了什么包,不需要module-info.java也可以确认,可以使用这两个命令:

    1. java命令的 --describe-modue选项 例:java --module-path mods --describle-module foo

    2. jmod命令的describe模式 例:jmod create -class-path mods/foo foo.jmod生成jmod文件后,使用jmod describe foo.jmod查看

      jdeps命令是用来查询类和方法,jar文件,module的依存关系的命令。(module的包公开信息不能通过此命令查询!!)

      java命令的 --show-module-resolution是用来表示查看程序运行时怎样寻找依存module的option。

  7. 关于非公开包的一时利用的问题。通过使用javac命令的--add-exports选项可以在编译时将想利用的包一时公开,被别的module可以利用。写法: 对象module/公开的包=利用的module 例如:-add-exports foo/com.test=hello

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2020-2021 Joe
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信