#osgi #apache-karaf #apache-felix #osgi-bundle #jbossfuse
#osgi #apache-karaf #apache-felix #osgi-bundle #jbossfuse
Вопрос:
Поскольку приведенные ниже зависимости не готовы к OSGI, я завернул их следующим образом :
<bundle>wrap:mvn:com.google.maps/google-maps-services/0.9.2</bundle>
<bundle>wrap:mvn:com.squareup.okhttp3/okhttp/3.13.1</bundle>
Похоже, что мой первый пакет не может получить доступ ко второму пакету, хотя я включил его в свой импорт следующим образом:
<Import-Package>okhttp3,*</import-Package>
Я получаю :
Caused by: java.lang.NoClassDefFoundError: okhttp3/Authenticator
at com.google.maps.GeoApiContext$Builder.<init>(GeoApiContext.java:318)
at com.elavon.nabsd.creditsafe.beans.GooglePlacesAPIContext.<clinit>(GooglePlacesAPIContext.java:11)
at com.elavon.nabsd.creditsafe.beans.AddressParser.getAddress(AddressParser.java:35)
at com.elavon.nabsd.creditsafe.beans.AddressParser.dummyResponse(AddressParser.java:76)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.camel.component.bean.MethodInfo.invoke(MethodInfo.java:408)
at org.apache.camel.component.bean.MethodInfo$1.doProceed(MethodInfo.java:279)
at org.apache.camel.component.bean.MethodInfo$1.proceed(MethodInfo.java:252)
... 13 more
Caused by: java.lang.ClassNotFoundException: okhttp3.Authenticator not found by wrap_mvn_com.google.maps_google-maps-services_0.9.2 [1180]
at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1556)
at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:77)
at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1993)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 24 more
Манифест
Manifest-Version: 1.0
Bnd-LastModified: 1552097042208
Build-Jdk: 1.8.0_181
Built-By: c041356
Bundle-Blueprint: OSGI-INF/blueprint/address-parser-blueprint.xml
Bundle-Description: XXX
Bundle-DocURL: XXX
Bundle-ManifestVersion: 2
Bundle-Name: XXX
Bundle-SymbolicName: address-parser
Bundle-Vendor: XXX
Bundle-Version: 1.0.24
Created-By: Apache Maven Bundle Plugin
DynamicImport-Package: *
Export-package: com.squareup.okhttp3,okhttp3
Import-Package: okhttp3,com.fasterxml.jackson.annotation,com.google.maps
,com.google.maps.errors,com.google.maps.model,org.apache.camel.componen
t.jasypt,org.jasypt.encryption.pbe.config,org.osgi.service.blueprint;ve
rsion="[1.0.0,2.0.0)",org.slf4j,org.apache.camel.component.http4,org.ap
ache.camel.component.jackson,com.squareup.okhttp3
Require-Capability: osgi.ee;filter:="(amp;(osgi.ee=JavaSE)(version=1.8))"
Tool: Bnd-3.0.0.201509101326
wrap_mvn_com.squareup.okhttp3_okhttp_3.13.1 (1202)
--------------------------------------------------
Originally-Created-By = Apache Maven 3.6.0
Created-By = 1.8.0_181 (Oracle Corporation)
Manifest-Version = 1.0
Bnd-LastModified = 1552095323499
Generated-By-Ops4j-Pax-From = wrap:mvn:com.squareup.okhttp3/okhttp/3.13.1
Build-Jdk = 1.8.0_162
Built-By = jwilson
Automatic-Module-Name = okhttp3
Tool = Bnd-2.3.0.201405100607
Bundle-ManifestVersion = 2
Bundle-SymbolicName = wrap_mvn_com.squareup.okhttp3_okhttp_3.13.1
Bundle-Version = 0
Bundle-Name = wrap_mvn_com.squareup.okhttp3_okhttp_3.13.1
Require-Capability =
osgi.ee;filter:=(amp;(osgi.ee=JavaSE)(version=1.8))
Export-Package =
okhttp3;uses:="javax.annotation,javax.net,javax.net.ssl,okio",
okhttp3.internal;uses:="javax.annotation,javax.net.ssl,okhttp3,okhttp3.internal.cache,okhttp3.internal.connection,okhttp3.internal.http,okhttp3.internal.http2,okio",
okhttp3.internal.annotations;uses:="javax.annotation,javax.annotation.meta",
okhttp3.internal.cache;uses:="javax.annotation,okhttp3,okhttp3.internal.io,okio",
okhttp3.internal.cache2,
okhttp3.internal.connection;uses:="javax.annotation,javax.net.ssl,okhttp3,okhttp3.internal.http,okhttp3.internal.http2,okhttp3.internal.ws",
okhttp3.internal.duplex,
okhttp3.internal.http;uses:="javax.annotation,okhttp3,okhttp3.internal.connection,okio",
okhttp3.internal.http1;uses:="okhttp3,okhttp3.internal.connection,okhttp3.internal.http,okio",
okhttp3.internal.http2;uses:="okhttp3,okhttp3.internal.connection,okhttp3.internal.http,okio",
okhttp3.internal.io;uses:=okio,
okhttp3.internal.platform;uses:="javax.annotation,javax.net.ssl,okhttp3,okhttp3.internal.tls",
okhttp3.internal.proxy,
okhttp3.internal.publicsuffix,
okhttp3.internal.tls;uses:=javax.net.ssl,
okhttp3.internal.ws;uses:="javax.annotation,okhttp3,okio"
Import-Package =
android.os;resolution:=optional,
android.util;resolution:=optional,
javax.annotation;resolution:=optional,
javax.annotation.meta;resolution:=optional,
javax.net;resolution:=optional,
javax.net.ssl;resolution:=optional,
javax.security.auth.x500;resolution:=optional,
okio;resolution:=optional,
wrap_mvn_com.google.maps_google-maps-services_0.9.2 (1180)
----------------------------------------------------------
Created-By = 1.8.0_181 (Oracle Corporation)
Manifest-Version = 1.0
Bnd-LastModified = 1552091296783
Generated-By-Ops4j-Pax-From = wrap:mvn:com.google.maps/google-maps-services/0.9.2
Tool = Bnd-2.3.0.201405100607
Bundle-ManifestVersion = 2
Bundle-SymbolicName = wrap_mvn_com.google.maps_google-maps-services_0.9.2
Bundle-Version = 0
Bundle-Name = wrap_mvn_com.google.maps_google-maps-services_0.9.2
Require-Capability =
osgi.ee;filter:=(amp;(osgi.ee=JavaSE)(version=1.8))
Export-Package =
com.google.maps;uses:="com.google.gson,com.google.maps.errors,com.google.maps.internal,com.google.maps.model,okhttp3",
com.google.maps.errors,
com.google.maps.internal;uses:="com.google.appengine.api.urlfetch,com.google.gson,com.google.gson.stream,com.google.maps,com.google.maps.errors,com.google.maps.model,okhttp3",
com.google.maps.internal.ratelimiter,
com.google.maps.model;uses:=com.google.maps.internal
Import-Package =
com.google.appengine.api.urlfetch;resolution:=optional,
com.google.gson;resolution:=optional,
com.google.gson.stream;resolution:=optional,
javax.crypto;resolution:=optional,
javax.crypto.spec;resolution:=optional,
okhttp3;resolution:=optional,
okio;resolution:=optional,
org.slf4j;resolution:=optional
Комментарии:
1. Пожалуйста, опубликуйте Mainfest из обоих пакетов с оболочкой. В противном случае это просто предположение и не поможет вам диагностировать подобные проблемы в будущем.
2. @Ancoron добавил манифест (некоторые проприетарные данные удалены). Спасибо.
3. Спасибо, хотя импорт на месте, виновником может быть порядок разрешения пакета. Если проблема будет решена путем обновления пакета «google-maps», то это будет «необязательный» импорт, который разрешит пакет перед пакетом «okhttp3».
4. Нет,
jar
файл не содержит jar-файл okhttp3 и его классы, поэтому вам придется добавить его отдельно.5. TL; DR: Нет и нет. Процессор упаковки ( bnd ) не просматривает транзитивные зависимости и принимает информацию о зависимостях Maven (если она доступна внутри jar:
META-INF/maven/...
) только как подсказку для генерации версий. Поскольку он не заботится о переходных зависимостях, также нет необходимости «исключать» их. По умолчанию упаковка просто генерирует дополнительные заголовки OSGi, требуемые вMETA-INF/MANIFEST.MF
, и просто копирует исходноеjar
содержимое как есть. Чтобы сделать это,bnd
в основном просто проверяет.class
файлы, а не какие-либо Maven poms.
Ответ №1:
Пакеты с оболочкой получают автоматически обнаруженные зависимости пакетов как «необязательные», потому что нет способа достоверно определить, действительно ли потребуется какой-то конкретный пакет или нет при использовании определенной функциональности, предоставляемой пакетом.
Следовательно, существование других пакетов и их экспортированных пакетов во время разрешения пакета определяет, какие пакеты действительно видны созданному загрузчику классов разрешенного пакета с оболочкой.
В вашем случае пакеты, экспортированные пакетом «okhttp3», были недоступны в то время, когда распознаватель искал доступный пакет для импорта при разрешении пакета «google-maps».
Это, в свою очередь, означает, что вам нужно убедиться, что либо:
- пакет «okhttp3» виден распознавателю во время разрешения пакета «google-maps»
- убедитесь, что требуемый импорт пакета не является «необязательным»
Хотя первый вариант может показаться проще, второй является более надежным и гибким.
wrap:
Протокол поддерживает перезапись сгенерированных заголовков OSGi, чтобы вы могли указать детали в соответствии с вашими потребностями. В нашем случае это было бы:
<bundle>wrap:mvn:com.google.maps/google-maps-services/0.9.2$overwrite=mergeamp;amp;Import-Package=okhttp3,okio,*;resolution:=optional</bundle>
(хотя, непроверенный и основанный только на документах)
УВЕДОМЛЕНИЕ
Перед использованием wrap
протокола, пожалуйста, посмотрите, была ли нужная библиотека уже OSGi-fied каким-либо другим проектом. Очень хорошим началом является просмотр пакетов, предоставляемых проектом Apache ServiceMix (который предоставляет okhttp3
пакет):
Комментарии:
1. Спасибо, я постараюсь. И я думаю,
amp;
что его следует экранировать в XML?2. Это то, что я получаю сейчас:
Unable to resolve 1294.0: missing requirement [1294.0] osgi.wiring.package; (osgi.wiring.package=com.google.appengine.api.urlfetch)
3. Ах, хорошо, тогда добавьте
;resolution:=optional
после*
, это должно указывать, что он по-прежнему использует optional для других пакетов.4. И теперь получаю
Caused by: java.lang.NoClassDefFoundError: Could not initialize class okhttp3.OkHttpClient
, хотя это находится вokhttp3
пакете. К сожалению,ServiceMix
не предоставляетokhttp3/3.13.1
5. Хорошо, если версии 3.12.1_1 недостаточно, то мы находимся, по крайней мере, на следующем уровне. Есть ли у вас
okio
в наличии?