Приложение успешно строится, но IntelliJ говорит, что мой модуль не читает некоторые другие модули

Я пытаюсь создать многомодульный проект, используя многопроектные функции JPMS и Gradle. У меня есть 3 модуля для тестирования: приложение, учитель и ученик. Ученик зависит от учителя, а приложение зависит от обоих. Модули ученика и учителя имеют свой собственный контроллер, службу, сущность и репозиторий. Каждый модуль имеет файл module-info.java.

module app {
    requires java.sql;
    requires org.hibernate.orm.core;

    requires spring.boot;
    requires spring.data.jpa;
    requires spring.boot.autoconfigure;

    requires spring.core;
    requires spring.beans;
    requires spring.context;

    requires teacher;
    requires student;

    opens az.chaypay.app to spring.core;
    exports az.chaypay.app to spring.beans, spring.context;
}

module teacher {
    requires static lombok;

    requires spring.web;

    exports az.chaypay.teacher to app;
    exports az.chaypay.teacher.api to student;
    exports az.chaypay.teacher.controller to spring.beans;
    exports az.chaypay.teacher.service.impl to spring.beans;

    opens az.chaypay.teacher.controller to spring.core;
    opens az.chaypay.teacher.repository.dao to spring.core, com.fasterxml.jackson.databind, org.hibernate.orm.core;
}

module student {
    requires static lombok;
    requires com.fasterxml.jackson.databind;

    requires spring.web;

    exports az.chaypay.student to app;
    exports az.chaypay.student.controller to spring.beans;
    exports az.chaypay.student.service.impl to spring.beans;

    opens az.chaypay.student.controller to spring.core;
    opens az.chaypay.student.repository.dao to spring.core, com.fasterxml.jackson.databind, org.hibernate.orm.core;

    requires teacher;
}

Когда я запускаю свое приложение с этими настройками, все работает. Приложения успешно создаются и запускаются. Но IntelliJ жалуется на импорт.

Приложение успешно строится, но IntelliJ говорит, что мой модуль не читает некоторые другие модули

Package 'org.springframework.data.jpa.repository' is declared in module 'spring.data.jpa', but module 'student' does not read it

Я не понимаю, если у Java проблемы с импортом, то почему мое приложение работает без ошибок. Почему мое приложение запускается без оператора require?

Пожалуйста, не размещайте изображения кода ИЛИ сообщения об ошибках. Скопируйте/вставьте сообщения и отформатируйте как код.

Jim Garrison 08.05.2022 20:28

Я не думаю, что spring-data-jpa является модульной зависимостью, поэтому она доступна вам в безымянном модуле. Ошибка исчезнет, ​​если вы удалятьrequires spring.data.jpa в модуле app?

Daniel Widdis 08.05.2022 21:46

Проект @DanielWiddis перестал работать после комментирования строки requires spring.data.jpa. Я думаю, что модуль ученик может использовать любой модуль, который требуется модулю приложение. Но IDE этого не понимает, может быть. Вопрос в том, что добавление строки requires spring.data.jpa в каждый файл module-info.java влияет на производительность моего проекта?

Pervin Yaqubzade 08.05.2022 23:15

Нет, производительность не изменится. В любом случае он импортируется ровно один раз, это влияет только на видимость. И student все равно не увидит модули из app, так как требует наоборот. Теоретически вы выполняете могrequires transitive spring.data.jpa в модуле teacher, и тогда это будет доступно для других модулей, которым это требуется; но обычно это делается только в том случае, если вы просто используете teacher API, который выставляет это требование. В вашем случае вы напрямую используете этот импорт в student, поэтому вы должны явно добавить это.

Daniel Widdis 09.05.2022 00:23
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
4
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Причина, по которой это «кажется» работает, заключается в том, что spring-data-jpa не является модульной зависимостью. Его можно включить в модульный проект, используя автоматическое имя модуля spring.data.jpa.

Когда вы добавляете requires spring.data.jpa в модуль app, он становится доступным в пути к модулям (со всеми экспортированными пакетами) в безымянном модуле.

Но оказавшись там, student действительно может видеть тот же безымянный модуль, когда вы его запускаете, поэтому он «случайно» работает, но это неправильно.

Оба ваших модуля app и student зависят от классов в пакете org.springframework.data.jpa.repository, поэтому предложение IntelliJ добавить requires spring.data.jpa к дескриптору модуля student правильно.

Другие вопросы по теме