Зависимость конфигурации PAM EXAM, требующая более старого JAR, когда доступен более новый
Я борюсь с конфигурацией PAX EXAM для интеграционных тестов проекта, который я начал работать несколько недель назад.
Основная проблема связана с зависимостями пакетов, которые я собираюсь протестировать, но я всегда мог развиваться для каждой проблемы, но теперь я действительно застрял.
Ниже я перечисляю текущую версию моего метода @Configuration:
@Configuration
public Option[] configure() {
// Runs outside the OSGi framework
return options(
junitBundles(),
wrappedBundle( mavenBundle( "antlr", "antlr" ).version( "2.7.7" ) ),
wrappedBundle( mavenBundle( "com.fasterxml", "classmate" ).version( "1.3.0" ) ),
wrappedBundle( mavenBundle( "org.javassist", "javassist" ).version( "3.18.1-GA" ) ),
wrappedBundle( mavenBundle( "org.jboss.logging", "jboss-logging" ).version( "3.1.0.GA" ) ),
wrappedBundle( mavenBundle( "dom4j", "dom4j" ).version( "1.6.1" ) ),
//wrappedBundle( mavenBundle( "org.hibernate.javax.persistence", "hibernate-jpa-2.0-api" ).version( "1.0.1.Final" ) ),
mavenBundle( "javax.persistence", "com.springsource.javax.persistence" ).version( "2.0.0" ),
wrappedBundle( mavenBundle( "org.jboss.spec.javax.transaction", "jboss-transaction-api_1.1_spec" ).version( "1.0.1.Final" ) ),
//wrappedBundle( mavenBundle( "javax.transaction", "javax.transaction-api" ).version( "1.2" ) ),
//wrappedBundle( mavenBundle( "javax.enterprise", "cdi-api" ).version( "1.0-SP4" ) ),
//wrappedBundle( mavenBundle( "org.jboss.spec.javax.interceptor", "jboss-interceptors-api_1.1_spec" ).version( "1.0.0.Beta1" ) ),
wrappedBundle( mavenBundle( "org.jboss", "jandex" ).version( "1.0.3.Final" ) ),
wrappedBundle( mavenBundle( "org.hibernate", "hibernate-core" ).version( "4.2.21.Final" ) ),
wrappedBundle( mavenBundle( "org.springframework", "spring-beans" ).version( "3.2.5.RELEASE" ) ).bundleSymbolicName( "org.springframework.beans" ).bundleVersion( "3.2.5.RELEASE" ),
wrappedBundle( mavenBundle( "org.springframework", "spring-context" ).version( "3.2.5.RELEASE" ) ).bundleSymbolicName( "org.springframework.context" ).bundleVersion( "3.2.5.RELEASE" ),
wrappedBundle( mavenBundle( "org.springframework", "spring-core" ).version( "3.2.5.RELEASE" ) ).bundleSymbolicName( "org.springframework.core" ).bundleVersion( "3.2.5.RELEASE" ),
wrappedBundle( mavenBundle( "org.springframework", "spring-aop" ).version( "3.2.5.RELEASE" ) ).bundleSymbolicName( "org.springframework.aop" ).bundleVersion( "3.2.5.RELEASE" ),
wrappedBundle( mavenBundle( "org.springframework", "spring-jdbc" ).version( "3.2.5.RELEASE" ) ).bundleSymbolicName( "org.springframework.jdbc" ).bundleVersion( "3.2.5.RELEASE" ),
wrappedBundle( mavenBundle( "org.springframework", "spring-tx" ).version( "3.2.5.RELEASE" ) ).bundleSymbolicName( "org.springframework.tx" ).bundleVersion( "3.2.5.RELEASE" ),
wrappedBundle( mavenBundle( "aopalliance", "aopalliance" ).version( "1.0" ) ),
wrappedBundle( mavenBundle( "org.springframework.osgi", "spring-osgi-core" ).version( "1.2.1" ) ),
wrappedBundle( mavenBundle( "org.springframework.osgi", "spring-osgi-annotation" ).version( "1.2.1" ) ),
wrappedBundle( mavenBundle( "org.springframework.osgi", "spring-osgi-extender" ).version( "1.2.1" ) ),
wrappedBundle( mavenBundle( "commons-lang", "commons-lang" ).version( "2.6" ) ),
wrappedBundle( mavenBundle( "org.hibernate.common", "hibernate-commons-annotations" ).version( "4.0.2.Final" ) );
}
Я удалил наши бизнес-зависимости, потому что они не нужны для объяснения.
Зависимости Spring OSGI ("spring-osgi-core", "spring-osgi-annotation" и т. Д.) Зависят от версии "2.5.6" Spring Framework, которую я уже выполняю с версиями "3.2.5.RELEASE" из этих библиотек, но по какой-то причине старые версии все еще применяются, как видно из приведенных ниже ошибок:
org.osgi.framework.BundleException: Unable to resolve br.com.mycompany.myapplication.osgi.entity.interceptor.entity-interceptor [39](R 39.0): missing requirement [br.com.mycompany.myapplication.osgi.entity.interceptor.entity-interceptor [39](R 39.0)] osgi.wiring.package; (&(osgi.wiring.package=org.springframework.osgi.extensions.annotation)(version>=1.2.0)) [caused by: Unable to resolve org.springframework.osgi.extensions.annotations [33](R 33.0): missing requirement [org.springframework.osgi.extensions.annotations [33](R 33.0)] osgi.wiring.package; (&(osgi.wiring.package=org.springframework.beans)(version>=2.5.6)(!(version>=4.0.0)))] Unresolved requirements: [[br.com.mycompany.myapplication.osgi.entity.interceptor.entity-interceptor [39](R 39.0)] osgi.wiring.package; (&(osgi.wiring.package=org.springframework.osgi.extensions.annotation)(version>=1.2.0))]
at org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:4111)
at org.apache.felix.framework.Felix.startBundle(Felix.java:2117)
at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1371)
at org.apache.felix.framework.FrameworkStartLevelImpl.run(FrameworkStartLevelImpl.java:308)
at java.lang.Thread.run(Thread.java:748)
org.osgi.framework.BundleException: Unable to resolve br.com.mycompany.myapplication.api.log.application-log-service [40](R 40.0): missing requirement [br.com.mycompany.myapplication.api.log.application-log-service [40](R 40.0)] osgi.wiring.package; (osgi.wiring.package=br.com.mycompany.myapplication.osgi.entity.interceptor.repository) [caused by: Unable to resolve br.com.mycompany.myapplication.osgi.entity.interceptor.entity-interceptor [39](R 39.0): missing requirement [br.com.mycompany.myapplication.osgi.entity.interceptor.entity-interceptor [39](R 39.0)] osgi.wiring.package; (&(osgi.wiring.package=org.springframework.osgi.extensions.annotation)(version>=1.2.0)) [caused by: Unable to resolve org.springframework.osgi.extensions.annotations [33](R 33.0): missing requirement [org.springframework.osgi.extensions.annotations [33](R 33.0)] osgi.wiring.package; (&(osgi.wiring.package=org.springframework.beans)(version>=2.5.6)(!(version>=4.0.0)))]] Unresolved requirements: [[br.com.mycompany.myapplication.api.log.application-log-service [40](R 40.0)] osgi.wiring.package; (osgi.wiring.package=br.com.mycompany.myapplication.osgi.entity.interceptor.repository)]
at org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:4111)
at org.apache.felix.framework.Felix.startBundle(Felix.java:2117)
at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1371)
at org.apache.felix.framework.FrameworkStartLevelImpl.run(FrameworkStartLevelImpl.java:308)
at java.lang.Thread.run(Thread.java:748)
ERROR: Bundle br.com.mycompany.myapplication.api.log.application-log-service [40] Error starting file:/tmp/1533155354575-0/pax-exam-downloads/br.com.mycompany.myapplication.api.log.application-log-service_1.46.0.SNAPSHOT.jar (org.osgi.framework.BundleException: Unable to resolve br.com.mycompany.myapplication.api.log.application-log-service [40](R 40.0): missing requirement [br.com.mycompany.myapplication.api.log.application-log-service [40](R 40.0)] osgi.wiring.package; (osgi.wiring.package=br.com.mycompany.myapplication.osgi.entity.interceptor.repository) [caused by: Unable to resolve br.com.mycompany.myapplication.osgi.entity.interceptor.entity-interceptor [39](R 39.0): missing requirement [br.com.mycompany.myapplication.osgi.entity.interceptor.entity-interceptor [39](R 39.0)] osgi.wiring.package; (&(osgi.wiring.package=org.springframework.osgi.extensions.annotation)(version>=1.2.0)) [caused by: Unable to resolve org.springframework.osgi.extensions.annotations [33](R 33.0): missing requirement [org.springframework.osgi.extensions.annotations [33](R 33.0)] osgi.wiring.package; (&(osgi.wiring.package=org.springframework.beans)(version>=2.5.6)(!(version>=4.0.0)))]] Unresolved requirements: [[br.com.mycompany.myapplication.api.log.application-log-service [40](R 40.0)] osgi.wiring.package; (osgi.wiring.package=br.com.mycompany.myapplication.osgi.entity.interceptor.repository)])
org.osgi.framework.BundleException: Unable to resolve br.com.mycompany.myapplication.api.log.listener.application-log-listener [41](R 41.0): missing requirement [br.com.mycompany.myapplication.api.log.listener.application-log-listener [41](R 41.0)] osgi.wiring.package; (osgi.wiring.package=br.com.mycompany.idpclient.model) Unresolved requirements: [[br.com.mycompany.myapplication.api.log.listener.application-log-listener [41](R 41.0)] osgi.wiring.package; (osgi.wiring.package=br.com.mycompany.idpclient.model)]
at org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:4111)
at org.apache.felix.framework.Felix.startBundle(Felix.java:2117)
at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1371)
at org.apache.felix.framework.FrameworkStartLevelImpl.run(FrameworkStartLevelImpl.java:308)
at java.lang.Thread.run(Thread.java:748)
У кого-нибудь есть идеи, почему это происходит?
Большое спасибо и наилучшие пожелания!
2 ответа
Вы не должны оборачивать все связки самостоятельно. Иногда создание пакета OSGi требует большего, чем может предоставить автоматическая упаковка. Хороший подход - проверить, что использует Apache Karaf.
Spring и многие другие библиотеки, которые вам нужны, предоставляются пакетами сервисов.
Попробуй это:
Download and start Apache Karaf 4.1.5
feature:install spring hibernate transaction
la -s
Итак, вы видите, какие комплекты karaf устанавливает на весну. Это должно работать лучше для вашего случая.
Кроме того, я бы действительно попытался уйти от весны, если вы хотите использовать OSGi. Известно, что Spring вызывает много проблем в OSGi, а новые версии еще менее совместимы.
Мне удалось обойти проблему, обернув зависимости "org.springframework", чтобы изменить их манифест, как показано ниже:
wrappedBundle( mavenBundle( "org.springframework", "spring-beans" ).version( "3.2.5.RELEASE" ) ).bundleSymbolicName( "org.springframework.beans" ).bundleVersion( "3.2.5.RELEASE" )
.exports( "*;version=3.2.5.RELEASE" ).overwriteManifest( WrappedUrlProvisionOption.OverwriteMode.MERGE ),
wrappedBundle( mavenBundle( "org.springframework", "spring-core" ).version( "3.2.5.RELEASE" ) ).bundleSymbolicName( "org.springframework.core" ).bundleVersion( "3.2.5.RELEASE" )
.exports( "*;version=3.2.5.RELEASE" ).overwriteManifest( WrappedUrlProvisionOption.OverwriteMode.MERGE ),
wrappedBundle( mavenBundle( "org.springframework", "spring-context" ).version( "3.2.5.RELEASE" ) ).bundleSymbolicName( "org.springframework.context" ).bundleVersion( "3.2.5.RELEASE" )
.exports( "*;version=3.2.5.RELEASE" ).overwriteManifest( WrappedUrlProvisionOption.OverwriteMode.MERGE ),
wrappedBundle( mavenBundle( "org.springframework", "spring-jdbc" ).version( "3.2.5.RELEASE" ) ).bundleSymbolicName( "org.springframework.jdbc" ).bundleVersion( "3.2.5.RELEASE" )
.exports( "*;version=3.2.5.RELEASE" ).overwriteManifest( WrappedUrlProvisionOption.OverwriteMode.MERGE ),
wrappedBundle( mavenBundle( "org.springframework", "spring-aop" ).version( "3.2.5.RELEASE" ) ).bundleSymbolicName( "org.springframework.aop" ).bundleVersion( "3.2.5.RELEASE" )
.exports( "*;version=3.2.5.RELEASE" ).overwriteManifest( WrappedUrlProvisionOption.OverwriteMode.MERGE ),
wrappedBundle( mavenBundle( "org.springframework", "spring-orm" ).version( "3.2.5.RELEASE" ) ).bundleSymbolicName( "org.springframework.orm" ).bundleVersion( "3.2.5.RELEASE" )
.exports( "*;version=3.2.5.RELEASE" ).overwriteManifest( WrappedUrlProvisionOption.OverwriteMode.MERGE ),
wrappedBundle( mavenBundle( "org.springframework", "spring-tx" ).version( "3.2.5.RELEASE" ) ).bundleSymbolicName( "org.springframework.transaction" ).bundleVersion( "3.2.5.RELEASE" )
.exports( "*;version=3.2.5.RELEASE" ).overwriteManifest( WrappedUrlProvisionOption.OverwriteMode.MERGE ),
С этим изменением зависимости org.springframework.osgi перестают запрашивать старую версию 2.5.6 org.springframework.
Теперь я сталкиваюсь с другой проблемой, которая заключается в том, чтобы запустить все как показано в другом вопросе: PAX EXAM Rest Endpoint не доступен для теста интеграции Феликса.