zoukankan      html  css  js  c++  java
  • jdk9模块化--引用模块

    上一次简单写了一个module并进行调用,这次会尝试模块间引用其他模块
    首先列出所有文件

    +--src
    	+--com.moduleA
    		+--module-info.java
    		+--com
    			+--moduleA
    				+--ModuleA.java
    	+--com.main
    		+--com
    			+--main
    				+Main.java
    

    模块引用

    moduleA的module-info

    module com.moduleA {
        exports com.moduleA;
    }
    

    ModuleA.java

    package com.moduleA;
    public class ModuleA {
        public void doModule() {
            System.out.println("from module1");
        }
    }
    

    main的module-info

    module com.main {
        requires com.moduleA;
    }
    

    Main.java

    package com.main;
    import com.moduleA.*;
    public class Main {
        public static void main(String[] args) {
            ModuleA m1=new ModuleA();
    		m1.doModule();
        }
    }
    

    在src同级目录运行下面命令进行编译

    >javac -d mods/com.moduleA srccom.moduleAmodule-info.java srccom.moduleAcommoduleAModuleA.java
    
    >javac --module-path mods -d mods/com.main src/com.main/module-info.java src/com.main/com/main/Main.java
    

    然后就可以运行main模块了

    >java --module-path mods -m com.main/com.main.Main
    from module1
    

    找不到模块

    模块编译时如果缺少对应的申明会被校验

    缺少模块

    删除生成的moduleA,运行main,会有如下报错

    Error occurred during initialization of boot layer
    java.lang.module.FindException: Module com.moduleA not found, required by com.main
    

    就算程序中没有使用到对应的模块,只要缺少requires中的包就会提示以上错误。

    缺少export

    当对moduleA不进行export,在编译main时会出现,同样javac也可以识别出moduleA的存在,以及它并未被导出

    srccom.maincommainMain.java:2: 错误: 程序包 com.moduleA 不可见
    import com.moduleA.*;
              ^
      (程序包 com.moduleA 已在模块 com.moduleA 中声明, 但该模块未导出它)
    1 个错误
    

    缺少require

    当main的module-info中不标明requires modualA,编译时就会出现如下错误,值得注意的是javac能识别出已经存在的moduleA,并说明了未读取该模块

    srccom.maincommainMain.java:2: 错误: 程序包 com.moduleA 不可见
    import com.moduleA.*;
              ^
      (程序包 com.moduleA 已在模块 com.moduleA 中声明, 但模块 com.main 未读取它)
    1 个错误
    

    当main不require,moduleA也不export的情况下,会优先显示该错误,所以javac首先会找到该类,然后通过export和requires进行控制。

    export范围

    在module-info中定义达的export,是暴露一个package下所有类,且需不会读取子package的内容,例如com.modulaA只会export该package下的类,其子package下的类并不会被包含在内,如果子package中的类被引用会提示缺少export同样的模块未导出。

  • 相关阅读:
    使用MSXML2::IXMLDOMDocument2Ptr每次都要CreateInstance和load(xmlfile)吗?
    .Net程序安装打包的一些经验贡献
    感慨SQL2005中的数据挖掘算法
    COM客户端没法激活托管代码生成的COM Server的原因
    预感~=命中注定
    创业经理10大必备素质
    全局缓存管理工具
    XML DOM的结构概念图解哪里是Element,哪里是Attribute,哪里是Text
    用GetVolumeInformation得到的不是硬盘的序列号,不要再抄这样的错误好吗?
    站在生活的背后
  • 原文地址:https://www.cnblogs.com/resentment/p/8012764.html
Copyright © 2011-2022 走看看