#intellij-idea #module #java-9
#intellij-idea #модуль #java-9
Вопрос:
Я никогда не использовал модули в IntelliJ IDEA, но в Java 9 появились модули (которые я также никогда не использовал, но хочу сейчас изучить, что это)
Итак, вопрос в том, совпадают ли они друг с другом? Или модули IDEA появились задолго до и для разных целей?
Ответ №1:
Это аналогичная концепция, появившаяся задолго до модулей Java 9. Это также не зависит от IDE. Системы сборки, такие как Maven и Gradle, также используют эту концепцию при работе с проектами, состоящими из нескольких подпроектов. В терминологии IntelliJ IDEA модуль является просто подпроектом (в Eclipse модуль является проектом, а рабочее пространство может иметь несколько проектов).
Модули Java 9 сопоставляются с модулями IntelliJ IDEA и предоставляют дополнительные функции через дескриптор модуля, определяющий:
- пакеты, которые он явно делает доступными для других модулей (все остальные пакеты в модуле неявно недоступны для других модулей)
- предлагаемые им услуги
- сервисы, которые он потребляет
- к каким другим модулям он допускает отражение
В IntelliJ IDEA уже есть концепция модулей для проекта. Каждый модуль IntelliJ IDEA создает свой собственный путь к классу. С внедрением новой системы модулей платформы Java модулям IntelliJ IDEA пришлось расширить свои возможности за счет поддержки пути к модулю платформы Java, если он используется вместо пути к классу.
Ссылки по теме:
Комментарии:
1. Спасибо, не могли бы вы указать, когда лучше использовать модули, а не зависимости (maven / gradle)?
2. Наиболее распространенный случай, когда вы работаете над большим проектом, в котором несколько подсистем разделены на разные модули / библиотеки. Вы можете выполнить рефакторинг, который затрагивает несколько модулей и библиотечный API. Использование зависимостей jar нецелесообразно, поскольку вам нужно будет перестраивать jar каждый раз, когда вы меняете код, а рефакторинги в одном модуле не повлияют на другие модули, которые настроены как зависимости jar вместо модулей IDE. Рассмотрим основное приложение и библиотеку, предоставляющую некоторый API. Вы хотите переименовать метод API в библиотеке. Это намного проще при использовании модулей.
Ответ №2:
Как бы я ни любил Intellij, я должен ответить «да»: есть одно большое отличие.
Модули Java 9 — это очень необходимый шаг к инкапсуляции и развязке. Но есть форма (случайная? патологическая?) связь в модулях Intellij в силу их принадлежности к одному проекту Intellij (и, следовательно, VCS). Модули Java 9 могут (и, вероятно, должны, с точки зрения инкапсуляции) разрабатываться в отдельных проектах VCS / IDE, из которых они могут предоставлять только те API, которые имеют смысл. Супер (родительский) POM — это механизм, обеспечивающий непатологическую связь между проектами для уменьшения избыточности.
Модуль, основанный на четко определенном домене и ограниченном контексте, должен быть свободно доступен для повторного использования: это большой шаг к компонентизации, о которой мы говорили годами. Эти домены не случайны — они отражают новый анализ мира. Если это звучит так, как будто я выступаю за что-то вроде анархии и балканизации, с которыми сталкиваются разработчики узлов — я не: хорошо проанализированный домен является ключевым.
Либо модули Intellij «получают коррупционную выгоду» от такого рода крайне желательного скрытого соединения, которое является одним из фантастических преимуществ проектов Intellij, либо нет никакой добавленной стоимости от их поддержки в одном проекте. Работа в среде, отличной от TBD, с ответвлением для каждого билета JIRA увеличивает стоимость такого рода соединения (личный опыт).
Обоснованием в другом ответе для этой связи является возможность «рефакторинга», который включает изменения в нескольких модулях. Но это запах кода / дизайна: либо в общедоступный API вносятся критические изменения, что является проблемой для всех клиентов, и обычно их можно избежать или смягчить с помощью некоторого воображения, устаревания, EOL-предупреждений (шаблон Strangler) и т.д., Либо модули демонстрируют патологическую сплоченность, вероятно, из-за неполного анализа в ограниченных контекстах.