Я пытаюсь создать многомодульный проект, используя многопроектные функции 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 жалуется на импорт.
Package 'org.springframework.data.jpa.repository' is declared in module 'spring.data.jpa', but module 'student' does not read it
Я не понимаю, если у Java проблемы с импортом, то почему мое приложение работает без ошибок. Почему мое приложение запускается без оператора require?
Я не думаю, что spring-data-jpa является модульной зависимостью, поэтому она доступна вам в безымянном модуле. Ошибка исчезнет, если вы удалятьrequires spring.data.jpa в модуле app?
Проект @DanielWiddis перестал работать после комментирования строки requires spring.data.jpa. Я думаю, что модуль ученик может использовать любой модуль, который требуется модулю приложение. Но IDE этого не понимает, может быть. Вопрос в том, что добавление строки requires spring.data.jpa в каждый файл module-info.java влияет на производительность моего проекта?
Нет, производительность не изменится. В любом случае он импортируется ровно один раз, это влияет только на видимость. И student все равно не увидит модули из app, так как требует наоборот. Теоретически вы выполняете могrequires transitive spring.data.jpa в модуле teacher, и тогда это будет доступно для других модулей, которым это требуется; но обычно это делается только в том случае, если вы просто используете teacher API, который выставляет это требование. В вашем случае вы напрямую используете этот импорт в student, поэтому вы должны явно добавить это.




Причина, по которой это «кажется» работает, заключается в том, что 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 правильно.
Пожалуйста, не размещайте изображения кода ИЛИ сообщения об ошибках. Скопируйте/вставьте сообщения и отформатируйте как код.