Подтвердить что ты не робот

Почему зависимость от "предоставленных" скрывает транзитные зависимости в 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 не найден

Что происходит?

4b9b3361

Ответ 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