Maven: hibernate-entitymanager вместе с javaee-api ломают мои юнит-тесты - PullRequest
6 голосов
/ 12 апреля 2011

У меня есть две зависимости javaee-api и hibernate-entitymanager в моем пом.Но они не очень хорошо работают вместе: как только я добавляю javaee-api, все мои модульные тесты ломаются из-за java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/validation/Validation.Без javaee-api все работает нормально.Почему это так?

(этот вопрос был отредактирован для решения проблемы;))

Ответы [ 3 ]

5 голосов
/ 12 апреля 2011

Зависимости Maven не имеют порядка , но предоставляют концепцию областей действия .

Так что вам нужно сделать, использовать области для построения правильныхнабор зависимостей для:

  • время компиляции
  • время выполнения на сервере: (используйте, например, provided для зависимостей, которые необходимы во время компиляции, но будут предоставлены сервером,поэтому ваше приложение содержит / не должно их содержать
  • время тестирования: используйте область действия test, чтобы добавить зависимости, которые нужны только для тестирования (например, junit)

В вашем специальномв этом случае похоже, что библиотека интерфейса javax.validation недоступна в тестах. Пусть они не включены в javaee-api. Если это так, добавьте:

     <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
        <version>1.0.0.GA</version>
        <scope>test</scope>
    </dependency>

Но будьте осторожны , ваше объяснение о том, что входит в состав сервера, и описанное поведение звучит для меня странно. - Я рекомендую дважды проверить, что предоставляет сервер и что включает javaee-api ретранслятор. Но могу я это сделать?неправильно иjavax.validation требуется только для явного теста

Причина, по которой проблема возникает только при включении javaee-api, может заключаться в том, что проверка Javax иногда включается только тогда, когда реализация доступна вclasspath.


Порядок зависимости имеет значение в некоторых случаях.«Проблема» заключается в том, что если на библиотеку / зависимость ссылаются в двух местах (прямая и неопределенная) и версия обеих ссылок на одну и ту же библиотеку отличается, Maven должен решить, какую версию использовать.

Перваяи наиболее важным критерием является глубина ссылки в дереве зависимостей.Если вы ссылаетесь на библиотеку непосредственно в вашем проекте POM, то это будет доминировать над всеми остальными.Если на библиотеку ссылается непосредственно библиотека, на которую ссылаются непосредственно вы, тогда это будет доминировать над всеми остальными, если есть еще одно косвенное указание.

Но в случае, когда две ссылки (на одну и ту же библиотеку в разных версиях)в той же глубине дерева зависимостей победит первое.( подробнее ).

Прежде всего,

4 голосов
/ 08 сентября 2012

Это связано с тем, что java-ee-api.jar содержит поврежденных классов .Существуют альтернативные зависимости , вокруг которых можно решить эту проблему.Изменение порядка в pom.xml тоже помогло мне.

0 голосов
/ 12 апреля 2011

Насколько я знаю, в Maven2 порядок зависимостей не сохраняется, и нет никакой гарантии порядка появления этих зависимостей в конечном пути к классам при выполнении вашего кода. В вашем случае я бы "исключил" перекрывающиеся библиотеки в вашей структуре зависимостей.

Смотрите здесь для документов по исключениям Maven.

Учитывая сложность сопоставления версий библиотеки, я бы посоветовал вам начать с одного из примеров Hibernate Maven и превратить его в свой проект.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...