Есть ли проблема с тем, что имя папки/каталога является именем модуля в Java 9?

Цитата из этого источника , это упоминает, что

Имя каталога, содержащего исходники модуля, должно совпадать с именем модуля, например для de.consol.devday.service

Является ли это хорошей рекомендацией, учитывая, что имя папки подвергается ограничению символов операционной системы (например, 255 как максимальная длина для Windows), и это может ограничивать то, как мы называем папку и модуль?

Надеюсь, что кто-то из основной команды Java может дать представление об этом и дать рекомендацию.

Цитируя другой пример из здесь: - введите здесь описание изображения< /а>

Имя модуля следует за именем папки, а имя папки ограничено 255 символами, это масштабируемо?

Может случиться так, что в реальном коде, скорее всего, имя папки может не достигать этого предела, однако такое ограничение должно быть упомянуто в официальном документе Java, чтобы учитывать такой способ (может быть, он есть? или кто-то может указать на это, если так?)

благодарить


person Macdevign    schedule 28.09.2017    source источник


Ответы (3)


Хотя я не из основной группы разработчиков Java, как можно было ожидать, но Состояние модуля Система читает это так:

Объявление модуля по соглашению компилируется в файл с именем module-info.class, который аналогичным образом помещается в выходной каталог class-file.

Ограничение символов операционной системы может ограничивать то, как мы называем папку и модуль, но в идеале, ИМХО, даже 255 символов более чем достаточно, чтобы продиктовать любое хорошее соглашение об именах и дизайн.


Просто чтобы добавить к этому, объявление module-info.java похоже (модуль против пакета) на существующий package-info.java, за исключением того факта, что последний использовался только для целей документации.

person Naman    schedule 28.09.2017
comment
Как мы структурируем исходный код, чтобы он соответствовал модульному принципу? Дальнейшее чтение на baeldung.com/project-jigsaw-java-modularity также см. такая же практика, как то, что я поднял. Работает ли IDE, как Intellij, так же? - person Macdevign; 28.09.2017
comment
Чтобы подтвердить модульный способ, вы должны включить класс с именем module-info.java, который предоставляет объявление своего модуля, - person Naman; 28.09.2017
comment
Я понимаю, что модуль-info.java необходим. Но вопрос в том, какой рекомендуемый способ компоновки модульной структуры проекта с точки зрения компоновки физического исходного кода ` - person Macdevign; 28.09.2017
comment
Рекомендуемый способ предложен как в связанных статьях вами, так и в связанном документе мной. module-info.java модуля com.foo.bar должен быть определен в каталоге com.foo.bar. - person Naman; 28.09.2017
comment
вопрос в том, насколько масштабируемым является этот способ, когда каталог ограничен ограничением имени папки? что, если я дошел до того, что полное имя превышает 255 символов? Вопрос, который я поднимаю, заключается не столько в том, чтобы просто следовать предложенному пути, сколько в том, чтобы подумать, является ли такой путь масштабируемым, как упомянуто в посте :} . Если действительно есть проблема с синхронизацией имен папок и модулей, почему эти сайты все еще предлагают этот путь? - person Macdevign; 28.09.2017
comment
Что ж, я не уверен, какие проблемы с масштабируемостью вы видите в соглашениях об именах, и полагаю, что синтаксис module-info также должен был обсуждаться в списках рассылки, но пока не могу найти ни одного, чтобы поделиться с вами. - person Naman; 28.09.2017
comment
Почему мы ожидаем, что вы будете из основной команды Java? - person Jacob G.; 29.09.2017

Именование модулей в качестве верхнего пакета является обязательным, а не обязательным. См., например, JSL 6.1.

Имя модуля должно соответствовать имени его основного экспортируемого пакета. Если модуль не имеет такого пакета или если по устаревшим причинам он должен иметь имя, которое не соответствует одному из его экспортируемых пакетов, то его имя все равно должно начинаться с обратной формы интернет-домена, с которой работает его автор. связанные.

Я бы посчитал Windows 7 устаревшей причиной (MAX_PATH = 260 символов). Обходной путь: используйте subst, чтобы назначить букву диска папке или выполнить обновление до Windows 10, которое может содержать 32 767 символов.

Имя пакета из 260 символов, отображаемое в Monaco 13, превышает ширину моего 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
...
person Jano    schedule 28.09.2017

Хотя большая часть обсуждения здесь сосредоточена на имени модуля, позвольте мне добавить, что макет каталога, показанный в вопросе, является обязательным только для того, что JEP 261 вызывает многомодульный режим. Инструменты сборки и IDE бесплатны для поддержки различных макетов каталогов. Обратите внимание, как JLS 7.3 делегирует некоторые решения «хост-системе»:

Хост-система может определить, что наблюдаемая обычная единица компиляции связана с модулем, выбранным хост-системой...

Здесь каждый инструмент, используемый для управления модульной компиляцией, можно рассматривать как хост-систему.

При этом не должно возникнуть проблем с тем, чтобы дать папке, содержащей исходники для модуля, любое полезное короткое имя, которое вам нравится.

person Stephan Herrmann    schedule 05.10.2017