代码之家  ›  专栏  ›  技术社区  ›  DJ180

Java 9:模块路径上可能有两个同名的模块

  •  13
  • DJ180  · 技术社区  · 7 年前

    模块路径上是否可能有两个名称完全相同(但内容略有不同)的模块?

    module com.dj.helper {
        exports com.dj.helper;
    }
    

    两者都包含 com.dj.helper

    module com.dj {
        requires com.dj.helper;
    }
    

    具有相同名称的两个模块都位于我的模块路径上。

    我希望在编译我的 com.dj

    2 回复  |  直到 7 年前
        1
  •  9
  •   kaartic JoshDM    3 年前

    在模块路径的同一目录中不可能有两个同名的模块。官方文件并没有把这些信息放在一个特别显眼的地方——它是 the Javadoc of ModuleFinder::of

    如果目录包含多个同名模块,则为错误。

    我创造了 a small demo project for the module system it covers that case 通过创建同一模块的两个版本。。。

    jar --create
        --file mods/monitor.observer.beta-1.0.jar
        --module-version 1.0
        -C classes/monitor.observer.beta .
    jar --create
        --file mods/monitor.observer.beta-2.0.jar
        --module-version 2.0
        -C classes/monitor.observer.beta .
    

    ... 然后在下一次编译中引用该文件夹。。。

    javac
        --module-path mods
        -d classes/monitor.statistics
        $(find monitor.statistics -name '*.java')
    

    error: duplicate module on application module path
    module in monitor.observer.beta
    1 error
    

    注意我说过 . 跨目录可以有多个模块。

    模块系统仅强制唯一性 目录。再次从 ModuleFinder::of (我的重点):

    模块查找器通过按数组索引顺序搜索每个目录、分解模块或打包模块来定位模块。它查找具有给定名称的模块的第一个匹配项,并 忽略序列中稍后出现的具有该名称的其他模块

        2
  •  5
  •   Community CDub    4 年前

    JEP 261 模块系统的模块路径描述如下:

    模块路径是一个序列,其中每个元素都是 模块定义

    • A. ,即模块化JAR文件或包含已编译模块定义的JMOD文件,或者

    • 分解模块目录

    然后描述了模块解析机制:

    在模块路径中搜索具有特定名称的模块时,模块系统采用该名称模块的第一个定义。忽略版本字符串(如果存在); 构建工具和容器应用程序负责配置模块路径,以避免版本冲突;模块系统的目标不是解决版本选择问题。

    如前所述,这意味着编译器只有在存在两个同名模块时才会抱怨 .