При работе с некоторыми спецификациями API, особенно с Java EE / Jakarta EE API, такими как JPA, вплоть до Java SE 8 библиотекам рекомендуется использовать Maven для добавления зависимости с областью действия provided
:
<dependency>
<groupId>jakarta.persistence</groupId>
<artifactId>jakarta.persistence-api</artifactId>
<scope>provided</scope>
</dependency>
С одной стороны, это приводит к уменьшению WAR- / EAR-файлов, поскольку сервер приложений уже предоставляет классы API.
Но также и в других случаях использования, таких как приложения Spring Boot, это лучшая практика, так как классы API доступны в различных JAR-файлах (например, также в javaee-api) и часто зависят от поставщика реализации.
Когда мы добавляем оператор заявок в информацию о модуле, например как:
requires java.persistence;
для этого потребуется указанный c модуль, а не пакет (в отличие от Import-Package
OSGi). И один и тот же пакет не должен предоставляться более чем одним модулем, AFAIK (без разделенных пакетов).
Так полезна ли область применения Maven provided
? Как нам справиться с этими случаями?
Хорошо, я могу использовать его для уменьшения размера WAR- / EAR-файлов, но только если серверы приложений содержат точно такой же модуль.
Полагаю, что в будущем в модульном мире будет только один модуль для классов API, верно (что может быть неплохо)?
И java -ee / jakarta-ee модули будет работать с requries transitive
утверждениями, а не включать сами классы?