Почему зависимость от "предоставленных" скрывает транзитные зависимости в Maven?
У меня есть три модуля в моем проекте Maven (это немного упрощено):
- содержит классы аннотированных сущностей JPA
- persistence создает экземпляр EntityManager и вызывает на нем методы
- приложение создает экземпляры классов в модели, устанавливает некоторые значения и передает их настойчивость
модель и постоянство, очевидно, зависят от javax.persistence
, но приложение не должно, я думаю.
Зависимость javax.persistence
перемещается в раздел POM dependencyManagement
верхнего уровня, поскольку он встречается в ряде подмодулей, где я ссылаюсь только на эту запись.
Что удивительно для меня, так это то, что я должен ссылаться на зависимость в application
, когда я устанавливаю свою область в provided
, тогда как мне не нужно, когда ее область видимости compile
.
В области provided
, если я не перечисляю его в приложении dependencies
для приложения, сборка завершается с сообщением об ошибке из javac:
com.sun.tools.javac.code.Symbol $CompletionFailure: файл класса для javax.persistence.InheritanceType не найден
Что происходит?
Ответы
Ответ 1
модель и постоянство, очевидно, зависят от javax.persistence, но приложение не должно, я думаю.
Это правда. Но разрешение транзитивных зависимостей не имеет ничего общего с вашей проблемой (и на самом деле javax.persistence
составляет от provided
до model
и persistence
, от которого application
зависит от области compile
, поэтому она опущена, как описано в 3.4.4 Транзитивные зависимости).
По-моему, вы являетесь жертвой этой ошибки: http://bugs.sun.com/view_bug.do?bug_id=6550655
У меня такие же проблемы с EJB3 объект, который использует аннотацию наследования: @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
Класс клиента, использующий этот объект, не будет компиляция, когда аннальности ejb3 а не на пути к классам, но с следующее сообщение: com.sun.tools.javac.code.Symbol$CompletionFailure:
class file for
javax.persistence.InheritanceType not
found
[...]
Обратите внимание, что это особый случай с ошибкой 6365854 (который, как сообщается, исправлен); проблема здесь заключается в том, что в аннотации используется enum как ее значение.
Текущее обходное решение - добавить недостающее перечисление в CLASSPATH.
В вашем случае "менее худшим" способом было бы добавить javax.persistence
в качестве provided
зависимости от модуля application
. Но обходной путь к ошибке JVM, application
, не должен нуждаться в этой зависимости для компиляции.
Ответ 2
umm, потому что если зависимости не являются транзитивными? это встроенное поведение для maven.
Ответ 3
Раздел dependencyManagement
объявляет, какие зависимости будут выглядеть, если вы их используете, а не используете их. Таким образом, вам все равно нужно объявить минимальное выражение о зависимости, чтобы настройка была применена в вашем дочернем проекте. Подробнее см. раздел управления зависимостями в книге Maven.
Требуемый минимум обычно является идентификатором groupId и artifactId.
Если вы хотите наследовать конфигурацию, не объявляя ее вообще, вы должны определить ее в родительском разделе dependencies
, а не dependencyManagement