【问题标题】:Is there a issue for the folder/directory name to be module name in Java 9?Java 9 中的文件夹/目录名称是否存在模块名称的问题?
【发布时间】:2017-09-28 02:26:13
【问题描述】:

引用this source,它提到

包含模块源的目录的名称应该是 等于模块的名称,例如对于 de.consol.devday.service

考虑到文件夹名称受到操作系统的字符限制(例如,Windows 的最大长度为 255)并且可能限制我们如何命名文件夹和模块,这是一个好的建议吗?

希望 Java 核心团队的人能就此提供见解并提供建议。

引用here的另一个例子:-

模块名跟在文件夹名后面,文件夹名有255个字符的限制,可以扩展吗?

可能是在实际代码中,文件夹名称很可能没有达到该限制,但是应该在官方 Java 文档中提及这种限制以考虑这种方式(也许它有?或者有人可以指出如果有的话? )

谢谢

【问题讨论】:

    标签: java java-9 java-platform-module-system java-module module-info


    【解决方案1】:

    虽然我不像你想象的那样来自 java 核心团队,但 The State of the Module System 将其读取为 -

    按照惯例,模块声明被编译成一个名为 module-info.class,类似地放置在类文件输出中 目录

    操作系统的字符限制可能会限制我们如何命名文件夹和模块,但理想情况下,恕我直言,即使是 255 个字符也足以决定任何良好的命名约定和设计。


    补充一点,module-info.java 声明与现有的 package-info.java 声明类似(模块与包),但后者仅用于文档目的。

    【讨论】:

    • 我们如何构建源代码以符合模块化方式?进一步阅读baeldung.com/project-jigsaw-java-modularity 也遵循与我提出的相同的做法。像 Intellij 这样的 IDE 也可以这样工作吗?
    • 要确认模块化方式,您必须包含名为module-info.java的类,该类提供其模块声明,
    • 我知道 module-info.java 是必不可少的。但问题是在物理源布局方面推荐的模块化项目结构布局方式是什么
    • 推荐的方式在你链接的文章和我链接的文档中都建议。模块com.foo.barmodule-info.java 将在com.foo.bar 目录中定义。
    • 好吧,我不确定您在命名约定中看到了哪些可扩展性问题,并且相信 module-info 的语法也一定在邮件列表中进行过辩论,只是找不到可以分享的现在和你在一起。
    【解决方案2】:

    将模块命名为顶级包是应该的,而不是必须的。例如,参见 JSL 6.1。

    模块的名称应该与其主体的名称相对应 导出的包。如果一个模块没有这样的包,或者如果 遗留原因它必须有一个不对应于其中之一的名称 它导出的包,那么它的名称仍应以 其作者所在的 Internet 域的反向形式 关联。

    我认为 Windows 7 是遗留原因(MAX_PATH = 260 个字符)。解决方法:使用 subst 将驱动器号分配给文件夹或更新到 Windows 10,它有 32,767 个字符的选择加入。

    在 Monaco 13 中呈现的包含 260 个字符的包名称超出了我的 23 英寸显示器的宽度 20 个字符。我不应该水平滚动来阅读模块名称,这是常识。请注意,在 JDK 9(+20,000 个类)中,最长的模块名称是 32 个字符:

    for file in $(/usr/libexec/java_home -v 9)/jmods/*; do echo -n `basename "$file"` | wc -m; done
    

    Oracle 甚至不遵守规则。如果你想导入java.util.logging.Logger,你导入java.logging,而不是java.util.logging。不,java.logging 它不是主包,它是 java.util.logging:

    $ cd $(/usr/libexec/java_home -v 9)/jmods/
    $ jar -tf java.logging.jmod 
    classes/module-info.class
    classes/java/util/logging/ConsoleHandler.class
    classes/java/util/logging/ErrorManager.class
    classes/java/util/logging/FileHandler$1.class
    classes/java/util/logging/FileHandler$InitializationErrorManager.class
    ...
    

    【讨论】:

      【解决方案3】:

      虽然这里的大多数讨论都集中在模块名称上,但让我补充一点,问题中显示的目录布局仅对于 JEP 261 所称的 多模块模式 是强制性的。构建工具和 IDE 可以免费支持不同的目录布局。请注意JLS 7.3 如何将一些决定委托给“主机系统”:

      主机系统可以确定一个可观察的普通编译单元 与主机系统选择的模块相关联...

      在这里,每一个用于驱动模块化编译的工具都可以被认为是一个宿主系统。

      有了这个,给包含模块源的文件夹提供任何你喜欢的有用的短名称应该没有问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-04
        • 2012-10-26
        • 1970-01-01
        • 1970-01-01
        • 2015-06-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多