Предположим, что у меня есть библиотека с groupId = org.abc
и artifactId = myLibrary
. Какое рекомендуемое имя для имени модуля: myLibrary
или org.abc.myLibrary
? Есть ли официальное руководство для схемы именования?
Как я могу назвать свой модуль Java 9?
Ответ 1
Некоторое время на ваш вопрос было два разных мнения, но во время разработки модульной системы сообщество остановилось на обратном DNS-подходе.
Уникальные имена модулей - обратный DNS
Здесь предполагается, что имена модулей должны быть глобально уникальными. Учитывая эту цель, наиболее прагматичный способ получить ее следует стратегии именования пакетов и отменить имя домена, с которым связаны сопровождающие. Состояние модульной системы говорит об этом:
Имена модулей, такие как имена пакетов, не должны конфликтовать. Рекомендуемым способом назвать модуль является использование шаблона обратного домена, который уже давно рекомендуется для именования пакетов.
Кроме того, Mark Reinhold пишет:
Настоятельно рекомендуем, чтобы все модули были названы в соответствии с обратным соглашением доменных имен в Интернете. Имя модуля должно соответствовать имени его основного экспортированного пакета API, который также должен следовать этому соглашению. Если в модуле нет такого пакета или если по устаревшим причинам он должен иметь имя, которое не соответствует одному из его экспортированных пакетов, то его имя должно, по крайней мере, начинаться с измененной формы домена Интернета, с которой автор.
Это довольно ясно и доступно другим экспертам Java как Стивен Коулборн.
Модули являются более значительными, чем артефакты
На какое-то время (начало 2016 года) появилась еще одна рекомендация, делающая раунды. Команда JDK заявила, что имена модулей, возможно, не должны быть уникальными после того, как "потому что модули более абстрактны, чем артефакты, которые их определяют". Марк Рейнгольд пишет:
Выберите имена модулей, которые начинаются с имени вашего проекта или продукта. Имена модулей (и пакетов), которые начинаются с обратных доменных имен, с меньшей вероятностью конфликтуют, но они излишне подробные, они начинаются с наименее важной информации (например,
com
,org
илиnet
) и они не хорошо читают после экзогенных изменений, таких как пожертвования с открытым исходным кодом или корпоративные приобретения (например,com.sun.*
).Обратный подход к доменным именам был разумным в первые дни Java, прежде чем у нас появились инструменты разработки, достаточно сложные, чтобы помочь нам справиться с случайным конфликтом. У нас есть такие инструменты сейчас, поэтому в будущем превосходная читаемость коротких имен модулей и пакетов, которые начинаются с имен проектов или продуктов, предпочтительнее обременительной многословности тех, которые начинаются с обратных доменных имен.
Кроме того, наличие имен модулей, которые не включают домен, позволит обменивать этот модуль на другую реализацию, если он имеет одно и то же имя (и, конечно же, реализует тот же открытый API).
В письме, выложенном выше, Рейнхольд документирует свое изменение мнений:
Некоторые люди могут предпочесть более короткие, ориентированные на проект имена, и они могут быть прекрасными в ограниченных проектах, которые никогда не будут видеть свет днем за пределами одной организации. Однако, если вы создадите модуль, который имеет хотя бы небольшой шанс быть открытым в будущем, то самым безопасным курсом является выбор имени обратного DNS для него в начале.
Резюме
Присяжные заседают, и все, кто высказывал свое мнение, соглашаются на обратный DNS, как на пакеты.
Ответ 2
Я думаю, что мы получили "официальный" ответ от Марка Рейнхольда:
Настоятельно рекомендуем, чтобы все модули были названы в соответствии с обратным соглашением доменных имен в Интернете. Имя модуля должно соответствовать имени его основного экспортированного пакета API, который также должен следовать этому соглашению. Если в модуле нет такого пакета или если по устаревшим причинам он должен иметь имя, которое не соответствует одному из его экспортированных пакетов, то его имя должно, по крайней мере, начинаться с измененной формы домена Интернета, с которой автор.