2

从这个来源引用,它提到

包含模块源的目录的名称应该与模块的名称相同,例如 de.consol.devday.service

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

希望Java核心团队的人可以对此提供见解并提供建议。

从这里引用另一个例子:- 在此处输入图像描述

模块名称跟随文件夹名称,文件夹名称受 255 个字符限制,可扩展吗?

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

感谢

4

3 回答 3

2

虽然我不像你想象的那样来自 java 核心团队,但是模块系统的状态是这样理解的——

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

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


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

于 2017-09-28T02:32:52.063 回答
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

甲骨文甚至不遵守规则。如果你想导入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
...
于 2017-09-28T14:22:56.540 回答
1

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

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

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

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

于 2017-10-05T09:51:54.263 回答