2012-05-16 9 views
1

Я использую в своем приложении osgi библиотеку querydsl. Артефакт querydsl-jpa имеет hibernate-jpa-2.0-api как зависимость.неразрешенный ограничитель в пучке, который был исключен из-за ошибки в maven

Я добавил такое исключение в мой pom.xml, так как я не использую спящий режим. Тем не менее, когда я пытаюсь запустить свою службу (через файл karaf features.xml), я получаю следующее:

Ошибка выполнения команды: не удалось запустить пакет mvn: com.mysema.querydsl/querydsl-jpa/2.5.0 в feature (s) querydsl-jpa-2.5.0: Неразрешенное ограничение в пакете com.mysema.querydsl.jpa [223]: Не удалось разрешить пакет 223.0: missing required [223.0]; (& (package = org.hibernate)) (версия> = 3.6.8.Final))

mvn зависимость от проекта: дерево не возвращает никакой спящий режим. Означает ли это, что зависимость osgi определяется исключительно файлом манифеста пакета querydsl, даже если зависимость явно исключена?

<dependency> 
     <groupId>com.mysema.querydsl</groupId> 
     <artifactId>querydsl-jpa</artifactId> 
     <version>2.5.0</version> 
     <exclusions> 
     <exclusion> 
     <groupId>org.hibernate.javax.persistence</groupId> 
    <artifactId>hibernate-jpa-2.0-api</artifactId> 
     </exclusion> 
     </exclusions> 
    </dependency> 

и экстракт из features.xml

<feature name='querydsl-jpa' version='2.5.0'> 
    <bundle>mvn:org.apache.felix/org.osgi.compendium/1.4.0</bundle> 
    <bundle>mvn:org.apache.geronimo.specs/geronimo-jpa_2.0_spec/1.1</bundle> 
    <bundle>mvn:com.mysema.querydsl/querydsl-core/2.5.0</bundle> 
    <bundle>mvn:com.mysema.commons/mysema-commons-lang/0.2.2</bundle> 
    <bundle>mvn:com.mysema.querydsl/querydsl-sql/2.5.0</bundle> 
    <bundle>mvn:com.mysema.querydsl/querydsl-jpa/2.5.0</bundle> 
</feature> 

ответ

1

pom.xml определяет, что происходит во время сборки, а не во время выполнения. Легко смешивать зависимости, объявленные в pom и зависимостях, объявленных в манифесте, поскольку оба, похоже, связаны с зависимостями, но они на самом деле очень разные. Рабочая среда OSGi не знает и не заботится о maven, поэтому никогда не смотрит на ваши файлы pom. Способ, которым OSGi обменивается информацией о зависимостях, - это манифест. Очевидно, что то, что в помпе, может повлиять на то, что в манифесте, но только на связки, которые вы строите. Здесь вы не перестраиваете пакет querydsl, поэтому манифест является тем, с которым он был отправлен.

Если этот пакет объявляет зависимость от спящего режима, вы должны предположить, что он действительно нуждается в спящем режиме. Если вы уверены, что зависимость не является обязательной, вы должны сообщить об ошибке владельцам пакета. Пока вы ждете исправления, ваши варианты затем перестраивают пакет, добавив директиву optional=true к пакету спящего режима или создайте фиктивный пакет, который экспортирует отсутствующие пакеты спящего режима. Это приведет к запуску пакета querydsl, но я бы очень осторожно относился к этому подходу. Вы используете хаки, чтобы обойти механизмы безопасности OSGi, и вы рискуете получить исключения NoClassDef и другие сбои во время выполнения, если только кодеки, которые используют спящий режим, полностью не используются.

+0

спасибо. Я боялся этого. Я действительно не хочу включать спящий режим в свои пакеты, поэтому, я думаю, я поговорю с ребятами querydsl (или прекратите использовать его). – santiagozky

+0

они исправили это недавно. поэтому следующий выпуск должен быть в порядке: https://github.com/mysema/querydsl/issues/147 – santiagozky

 Смежные вопросы

  • Нет связанных вопросов^_^